library(coda)
library(bayesplot) 
library(ggplot2)
library(ggsci)
library(khroma)
library(tidyverse)
library(reshape2)
library(yardstick)
library(here)
knitr::opts_chunk$set(echo = TRUE, dpi = 300 )

Set up MCSim file

# this markdown file must be saved in top level directory for the following to work; the mcsim code depends on getwd results.
mdir <- "MCSim"
source(here::here(mdir,"setup_MCSim.R"))
# Make mod.exe (used to create mcsim executable from model file)
makemod() 
The mod.exe had been created.

Set filenames and load data

Set up dataset

id_lut <- multicheck$df_check %>% select(Level) %>% unique ()  %>%
  mutate(dataset = c( 
    rep("Decatur M Train", 9),
    rep("Decatur F Train", 9),
    rep("Decatur M Test", 9),
    rep("Decatur F Test", 10),
    rep("Minnesota Train", 49),
    rep("Minnesota Test", 49),
    'Paulsboro-Train','Horsham-Train',
    'Warminster-Test','Warrington-Train'), 
    Sex = c( 
    rep("M", 9),
    rep("F", 9),
    rep("M", 9),
    rep("F", 10),
    rep("Mixed", 49),
    rep("Mixed", 49), 
    rep("Mixed", 4)),
    City = c( 
    rep("Decatur", 18),
    rep("Decatur", 19),
    rep("Minnesota", 98),
    'Paulsboro','Horsham','Warminster','Warrington'), 
    Train_Test = c( 
    rep("Train", 9),
    rep("Train", 9),
    rep("Test", 9),
    rep("Test", 10),
    rep("Train", 49),
    rep("Test", 49),
    'Train','Train',
    'Test','Test'),
        datatype = c(
      rep("Individual",9+9+9+10+49+49),
      rep("Summary",4)),
    Simulation = row_number(),
    variable = paste0(dataset, " ",Simulation))

id_lut$dataset <- factor(id_lut$dataset,levels=
                           c("Decatur M Train","Decatur F Train","Arnsberg M Train",
                             "Arnsberg F Train","Decatur M Test","Decatur F Test","Arnsberg M Test",
                             "Arnsberg F Test","Minnesota Train","Minnesota Test",
                             'Lubeck-Bartell-Train', 'Lubeck-Bartell-Test',
                             'Little Hocking-Bartell-Train', 'Little Hocking-Bartell-Test',
                             'Little Hocking-Emmett-Test','Paulsboro-Train','Horsham-Train',
                             'Warminster-Test','Warrington-Train'))
id_lut$City <- factor(id_lut$City,levels = 
                        c("Decatur","Arnsberg","Minnesota",'Lubeck-Bartell',
                          'Little Hocking-Bartell','Little Hocking-Emmett',
                          'Paulsboro','Horsham','Warminster','Warrington'))
 

indiv_lut <- id_lut %>% 
  filter(City %in% c("Decatur", "Minnesota")) %>%
  mutate(  dataset = as.factor(dataset))

nv <- data.frame(dataset =unique(indiv_lut$dataset), 
           variable= rep("Pop GM", 6),
           type= rep("Pop GM", 6), stringsAsFactors = FALSE)

Individual parameters

set.seed(314159)

indiv_parms <- indiv_lut
lnkparmnames <- paste("ln_k.",gsub("_",".",indiv_parms$Level),".",sep="")
lnVdparmnames <- paste("ln_Vd.",gsub("_",".",indiv_parms$Level),".",sep="")

parmsamp <- apply(multicheck$parms.samp,2,sample,1)

## Random z-score estimate of each parameter
indiv_parms$ln_k.z.samp <- parmsamp[lnkparmnames]
indiv_parms$ln_Vd.z.samp <- parmsamp[lnVdparmnames]

normd <- data.frame(x=qnorm(ppoints(200)))
normd$y <- dnorm(normd$x)

iplotk<-
  ggplot(subset(indiv_parms,Train_Test=="Train"))+
    geom_histogram(aes(x=ln_k.z.samp,after_stat(density)),bins=20)+facet_wrap(~City,ncol=1)+
    geom_line(aes(x=x,y=y),data=normd)+
    xlab("Individual z-scores for k") + theme_bw()

iplotVd<-
  ggplot(subset(indiv_parms,Train_Test=="Train"))+
    geom_histogram(aes(x=ln_Vd.z.samp,after_stat(density)),bins=20)+facet_wrap(~City,ncol=1)+
    geom_line(aes(x=x,y=y),data=normd)+
    xlab("Individual z-scores for Vd") + theme_bw()

print(iplotk)

print(iplotVd)

ggsave(file.path("output-plots",
             paste0( sa,"Indiv_zscores_k_PFOS.pdf")),iplotk,dpi=600)
Saving 3.5 x 3.5 in image
ggsave(file.path("output-plots",
             paste0( sa,"Indiv_zscores_Vd_PFOS.pdf")),iplotVd,dpi=600)
Saving 3.5 x 3.5 in image
ggsave(file.path("output-plots",
             paste0( sa,"Indiv_zscores_k_PFOS.png")),iplotk,dpi=600)
Saving 3.5 x 3.5 in image
ggsave(file.path("output-plots",
             paste0( sa,"Indiv_zscores_Vd_PFOS.png")),iplotVd,dpi=600)
Saving 3.5 x 3.5 in image

Scatter plot of predictions (median of multicheck samples) versus data.

This is a Figure 2 panel. Needed to use “scale=1.1” in ggsave to match PFOA.

nrow(multicheck$df_check)
[1] 88000
nrow(id_lut)
[1] 139
multicheck$df_check %>% left_join(id_lut) %>% nrow()
Joining, by = c("Level", "Simulation")
[1] 88000
names(multicheck$df_check)
[1] "Level"      "Simulation" "Output_Var" "Time"       "Data"      
[6] "Prediction"
Level

Simulation

Output_Var

Time

Data

Prediction
multicheck2 <- multicheck$df_check %>% left_join(id_lut)%>% 
  group_by_at ( vars(-Prediction)) %>% 
  summarise(Prediction = median(Prediction)) %>%
  ungroup() %>%
  group_by(City) %>% 
  mutate(Train_Test = factor(Train_Test, levels = c("Train", "Test")),
         `City (datatype)` = factor (paste0("\n", City, "\n(", datatype, ")\n") ),
         label = case_when(Train_Test=="Train" ~ "C: PFOS Train",
                           Train_Test=="Test"  ~"D: PFOS Test",
                           TRUE ~ ""))
Joining, by = c("Level", "Simulation")
`summarise()` has grouped output by 'Level', 'Simulation', 'Output_Var', 'Time', 'Data', 'dataset', 'Sex', 'City', 'Train_Test', 'datatype'. You can override using the `.groups` argument.
 #define color for testing boxplots
bp_cols <- c (as.character (khroma::colour("muted")(9)) , "#191919")   
bp_cols <-bp_cols[c(1,3, 7, 10:8)]# plot_scheme_colourblind(bp_cols) 

### Create aesthetics lookup
aes_lut <- multicheck2 %>% ungroup() %>% 
  group_by(City, datatype,  `City (datatype)` ) %>% summarise () %>% ungroup() %>%
  mutate( cols = bp_cols, city_fills =   bp_cols , 
          # for individual level on point plot (multicheck2), darken outlines for visibility, use standard colors otherwise
         city_outlines =  if_else(datatype == "Individual"  ,  colorspace::darken(city_fills, 0.3), city_fills) ,  
         shapes = case_when(datatype == "Individual"  & `City` %in% c('Decatur', 'Arnsberg', 'Minnesota')   ~  23,
                            datatype == "Summary" &`City` %in% c("Horsham", "Warminster",  "Warrington") ~ 2,
                            datatype == "Summary" & `City` == "Paulsboro" ~ 1,
                            TRUE ~ 18                                ), 
         size = if_else(datatype =="Individual", 1.75, 2.5 ) )  
`summarise()` has grouped output by 'City', 'datatype'. You can override using the `.groups` argument.
source( paste0(gsub(basename(here()), 'shared_functions', here()), '/plot_scatter_mcheck.r'))

p2 <- plot_scatter_mcheck(dframe = multicheck2,  pfas_nom = pfas_name, aes_lut_fn = aes_lut )
Joining, by = "facet_label"
print(p2) 

ggsave(here ("output-plots", paste0( sa,"multicheckplot_", pfas_name,
               ".pdf")),p2,dpi=600, scale=1.1)
Saving 8.8 x 3.85 in image
ggsave(here ("output-plots", paste0( sa,"multicheckplot_", pfas_name,
               ".png")),p2,dpi=600, scale=1.1)
Saving 8.8 x 3.85 in image

Parse multicheck

df_check <- multicheck$df_check
df_check <- subset(df_check,Data > 0) 

n1 <- nrow(df_check)
id_chks <- df_check %>% select(Level) %>% unique() %>% bind_cols(id_lut)  %>%
 mutate(dataset = as.factor(dataset), Sex = as.factor(Sex), City = as.factor(City), 
         Train_Test = as.factor(Train_Test))
New names:
* Level -> Level...1
* Level -> Level...2
df_check <- df_check %>% left_join(id_chks)%>%
  mutate(Dataset = paste(as.character(dataset), Simulation),
         Sex = ordered(Sex, levels = c("M", "F", "Mixed"), 
                       labels = c("Female", "Male", "Mixed (all sexes)")))
Joining, by = "Simulation"
n2 <- nrow(df_check)
if(n1 != n2)print("duplicates created in id-lut join")
df_check$Time.desc <- as.character(paste0("T=",df_check$Time))
df_check$Time.desc[df_check$Time.desc == "T=1e-06"] <- "SteadyState"
df_check$Dataset.Time <- interaction(df_check$Dataset,
                                     df_check$Time.desc,lex.order=TRUE)
df_check$Dataset.Time <- factor(df_check$Dataset.Time,
                                levels=levels(df_check$Dataset.Time))
calibdata <- df_check[,names(df_check) != "Prediction"]
calibdata <- calibdata[!duplicated(calibdata),]
print(calibdata)
     Level Simulation Output_Var     Time    Data Level...1 Level...2
1    1_1_1          1   Cserum_t 0.000000  82.400     1_1_1     1_1_1
2    1_1_1          1   Cserum_t 5.802000  70.300     1_1_1     1_1_1
3    1_1_2          2   Cserum_t 0.000000  32.600     1_1_2     1_1_2
4    1_1_2          2   Cserum_t 5.802000  14.200     1_1_2     1_1_2
5    1_1_3          3   Cserum_t 0.000000 236.000     1_1_3     1_1_3
6    1_1_3          3   Cserum_t 5.802000  75.400     1_1_3     1_1_3
7    1_1_4          4   Cserum_t 0.000000  61.000     1_1_4     1_1_4
8    1_1_4          4   Cserum_t 5.802000  12.800     1_1_4     1_1_4
9    1_1_5          5   Cserum_t 0.000000 182.000     1_1_5     1_1_5
10   1_1_5          5   Cserum_t 5.802000  43.900     1_1_5     1_1_5
11   1_1_6          6   Cserum_t 0.000000  25.300     1_1_6     1_1_6
12   1_1_6          6   Cserum_t 5.802000  18.800     1_1_6     1_1_6
13   1_1_7          7   Cserum_t 0.000000 113.000     1_1_7     1_1_7
14   1_1_7          7   Cserum_t 5.802000  24.000     1_1_7     1_1_7
15   1_1_8          8   Cserum_t 0.000000  78.200     1_1_8     1_1_8
16   1_1_8          8   Cserum_t 5.802000  26.400     1_1_8     1_1_8
17   1_1_9          9   Cserum_t 0.000000  54.400     1_1_9     1_1_9
18   1_1_9          9   Cserum_t 5.802000  26.500     1_1_9     1_1_9
19  1_1_10         10   Cserum_t 0.000000  81.200    1_1_10    1_1_10
20  1_1_10         10   Cserum_t 5.802000  31.500    1_1_10    1_1_10
21  1_1_11         11   Cserum_t 0.000000  70.700    1_1_11    1_1_11
22  1_1_11         11   Cserum_t 5.802000  50.200    1_1_11    1_1_11
23  1_1_12         12   Cserum_t 0.000000  13.700    1_1_12    1_1_12
24  1_1_12         12   Cserum_t 5.802000  12.800    1_1_12    1_1_12
25  1_1_13         13   Cserum_t 0.000000  42.000    1_1_13    1_1_13
26  1_1_13         13   Cserum_t 5.802000  28.100    1_1_13    1_1_13
27  1_1_14         14   Cserum_t 0.000000  98.000    1_1_14    1_1_14
28  1_1_14         14   Cserum_t 5.802000  35.100    1_1_14    1_1_14
29  1_1_15         15   Cserum_t 0.000000  56.900    1_1_15    1_1_15
30  1_1_15         15   Cserum_t 5.802000  45.900    1_1_15    1_1_15
31  1_1_16         16   Cserum_t 0.000000  32.500    1_1_16    1_1_16
32  1_1_16         16   Cserum_t 5.802000  13.300    1_1_16    1_1_16
33  1_1_17         17   Cserum_t 0.000000  60.500    1_1_17    1_1_17
34  1_1_17         17   Cserum_t 5.802000  27.600    1_1_17    1_1_17
35  1_1_18         18   Cserum_t 0.000000  43.800    1_1_18    1_1_18
36  1_1_18         18   Cserum_t 5.802000  34.700    1_1_18    1_1_18
37   1_2_1         19   Cserum_t 0.000000  64.100     1_2_1     1_2_1
38   1_2_1         19   Cserum_t 5.802000  15.000     1_2_1     1_2_1
39   1_2_2         20   Cserum_t 0.000000  89.600     1_2_2     1_2_2
40   1_2_2         20   Cserum_t 5.802000  24.700     1_2_2     1_2_2
41   1_2_3         21   Cserum_t 0.000000  74.700     1_2_3     1_2_3
42   1_2_3         21   Cserum_t 5.802000  39.800     1_2_3     1_2_3
43   1_2_4         22   Cserum_t 0.000000  68.400     1_2_4     1_2_4
44   1_2_4         22   Cserum_t 5.802000  30.000     1_2_4     1_2_4
45   1_2_5         23   Cserum_t 0.000000  72.900     1_2_5     1_2_5
46   1_2_5         23   Cserum_t 5.802000  32.200     1_2_5     1_2_5
47   1_2_6         24   Cserum_t 0.000000  78.100     1_2_6     1_2_6
48   1_2_6         24   Cserum_t 5.802000  45.400     1_2_6     1_2_6
49   1_2_7         25   Cserum_t 0.000000  24.100     1_2_7     1_2_7
50   1_2_7         25   Cserum_t 5.802000  15.400     1_2_7     1_2_7
51   1_2_8         26   Cserum_t 0.000000  60.900     1_2_8     1_2_8
52   1_2_8         26   Cserum_t 5.802000  22.000     1_2_8     1_2_8
53   1_2_9         27   Cserum_t 0.000000 137.000     1_2_9     1_2_9
54   1_2_9         27   Cserum_t 5.802000  70.700     1_2_9     1_2_9
55  1_2_10         28   Cserum_t 0.000000  26.600    1_2_10    1_2_10
56  1_2_10         28   Cserum_t 5.802000  15.200    1_2_10    1_2_10
57  1_2_11         29   Cserum_t 0.000000 120.000    1_2_11    1_2_11
58  1_2_11         29   Cserum_t 5.802000  61.700    1_2_11    1_2_11
59  1_2_12         30   Cserum_t 0.000000  60.900    1_2_12    1_2_12
60  1_2_12         30   Cserum_t 5.802000  22.500    1_2_12    1_2_12
61  1_2_13         31   Cserum_t 0.000000  41.100    1_2_13    1_2_13
62  1_2_13         31   Cserum_t 5.802000  12.400    1_2_13    1_2_13
63  1_2_14         32   Cserum_t 0.000000  39.200    1_2_14    1_2_14
64  1_2_14         32   Cserum_t 5.802000  12.800    1_2_14    1_2_14
65  1_2_15         33   Cserum_t 0.000000  18.100    1_2_15    1_2_15
66  1_2_15         33   Cserum_t 5.802000  13.400    1_2_15    1_2_15
67  1_2_16         34   Cserum_t 0.000000  19.400    1_2_16    1_2_16
68  1_2_16         34   Cserum_t 5.802000  16.800    1_2_16    1_2_16
69  1_2_17         35   Cserum_t 0.000000  21.500    1_2_17    1_2_17
70  1_2_17         35   Cserum_t 5.802000  11.800    1_2_17    1_2_17
71  1_2_18         36   Cserum_t 0.000000  53.800    1_2_18    1_2_18
72  1_2_18         36   Cserum_t 5.802000  30.600    1_2_18    1_2_18
73  1_2_19         37   Cserum_t 0.000000  16.000    1_2_19    1_2_19
74  1_2_19         37   Cserum_t 5.802000   6.700    1_2_19    1_2_19
75   1_3_1         38   Cbgd_Css 0.000001  13.000     1_3_1     1_3_1
76   1_3_2         39   Cbgd_Css 0.000001  50.000     1_3_2     1_3_2
77   1_3_3         40   Cbgd_Css 0.000001  45.000     1_3_3     1_3_3
78   1_3_4         41   Cbgd_Css 0.000001  55.000     1_3_4     1_3_4
79   1_3_5         42   Cbgd_Css 0.000001  58.000     1_3_5     1_3_5
80   1_3_6         43   Cbgd_Css 0.000001  50.000     1_3_6     1_3_6
81   1_3_7         44   Cbgd_Css 0.000001 150.000     1_3_7     1_3_7
82   1_3_8         45   Cbgd_Css 0.000001  12.000     1_3_8     1_3_8
83   1_3_9         46   Cbgd_Css 0.000001  58.000     1_3_9     1_3_9
84  1_3_10         47   Cbgd_Css 0.000001  21.000    1_3_10    1_3_10
85  1_3_11         48   Cbgd_Css 0.000001  19.000    1_3_11    1_3_11
86  1_3_12         49   Cbgd_Css 0.000001  25.000    1_3_12    1_3_12
87  1_3_13         50   Cbgd_Css 0.000001   4.000    1_3_13    1_3_13
88  1_3_14         51   Cbgd_Css 0.000001  32.000    1_3_14    1_3_14
89  1_3_15         52   Cbgd_Css 0.000001  58.000    1_3_15    1_3_15
90  1_3_16         53   Cbgd_Css 0.000001   8.500    1_3_16    1_3_16
91  1_3_17         54   Cbgd_Css 0.000001   5.500    1_3_17    1_3_17
92  1_3_18         55   Cbgd_Css 0.000001  58.000    1_3_18    1_3_18
93  1_3_19         56   Cbgd_Css 0.000001  50.000    1_3_19    1_3_19
94  1_3_20         57   Cbgd_Css 0.000001 145.000    1_3_20    1_3_20
95  1_3_21         58   Cbgd_Css 0.000001  77.000    1_3_21    1_3_21
96  1_3_22         59   Cbgd_Css 0.000001  50.000    1_3_22    1_3_22
97  1_3_23         60   Cbgd_Css 0.000001  90.000    1_3_23    1_3_23
98  1_3_24         61   Cbgd_Css 0.000001  14.000    1_3_24    1_3_24
99  1_3_25         62   Cbgd_Css 0.000001  21.000    1_3_25    1_3_25
100 1_3_26         63   Cbgd_Css 0.000001  35.000    1_3_26    1_3_26
101 1_3_27         64   Cbgd_Css 0.000001  28.000    1_3_27    1_3_27
102 1_3_28         65   Cbgd_Css 0.000001   7.000    1_3_28    1_3_28
103 1_3_29         66   Cbgd_Css 0.000001 150.000    1_3_29    1_3_29
104 1_3_30         67   Cbgd_Css 0.000001  50.000    1_3_30    1_3_30
105 1_3_31         68   Cbgd_Css 0.000001  50.000    1_3_31    1_3_31
106 1_3_32         69   Cbgd_Css 0.000001  70.000    1_3_32    1_3_32
107 1_3_33         70   Cbgd_Css 0.000001  21.000    1_3_33    1_3_33
108 1_3_34         71   Cbgd_Css 0.000001  19.000    1_3_34    1_3_34
109 1_3_35         72   Cbgd_Css 0.000001  40.000    1_3_35    1_3_35
110 1_3_36         73   Cbgd_Css 0.000001  70.000    1_3_36    1_3_36
111 1_3_37         74   Cbgd_Css 0.000001  45.000    1_3_37    1_3_37
112 1_3_38         75   Cbgd_Css 0.000001  22.000    1_3_38    1_3_38
113 1_3_39         76   Cbgd_Css 0.000001  29.000    1_3_39    1_3_39
114 1_3_40         77   Cbgd_Css 0.000001  28.000    1_3_40    1_3_40
115 1_3_41         78   Cbgd_Css 0.000001   6.500    1_3_41    1_3_41
116 1_3_42         79   Cbgd_Css 0.000001  22.000    1_3_42    1_3_42
117 1_3_43         80   Cbgd_Css 0.000001  21.000    1_3_43    1_3_43
118 1_3_44         81   Cbgd_Css 0.000001  41.000    1_3_44    1_3_44
119 1_3_45         82   Cbgd_Css 0.000001  41.000    1_3_45    1_3_45
120 1_3_46         83   Cbgd_Css 0.000001  16.000    1_3_46    1_3_46
121 1_3_47         84   Cbgd_Css 0.000001  70.000    1_3_47    1_3_47
122 1_3_48         85   Cbgd_Css 0.000001  16.000    1_3_48    1_3_48
123 1_3_49         86   Cbgd_Css 0.000001  30.000    1_3_49    1_3_49
124  1_4_1         87   Cbgd_Css 0.000001   3.000     1_4_1     1_4_1
125  1_4_2         88   Cbgd_Css 0.000001   8.700     1_4_2     1_4_2
126  1_4_3         89   Cbgd_Css 0.000001   9.000     1_4_3     1_4_3
127  1_4_4         90   Cbgd_Css 0.000001  11.000     1_4_4     1_4_4
128  1_4_5         91   Cbgd_Css 0.000001  15.000     1_4_5     1_4_5
129  1_4_6         92   Cbgd_Css 0.000001  16.000     1_4_6     1_4_6
130  1_4_7         93   Cbgd_Css 0.000001  40.000     1_4_7     1_4_7
131  1_4_8         94   Cbgd_Css 0.000001  26.000     1_4_8     1_4_8
132  1_4_9         95   Cbgd_Css 0.000001  18.000     1_4_9     1_4_9
133 1_4_10         96   Cbgd_Css 0.000001  20.000    1_4_10    1_4_10
134 1_4_11         97   Cbgd_Css 0.000001  35.000    1_4_11    1_4_11
135 1_4_12         98   Cbgd_Css 0.000001  41.000    1_4_12    1_4_12
136 1_4_13         99   Cbgd_Css 0.000001  12.000    1_4_13    1_4_13
137 1_4_14        100   Cbgd_Css 0.000001  15.000    1_4_14    1_4_14
138 1_4_15        101   Cbgd_Css 0.000001  18.000    1_4_15    1_4_15
139 1_4_16        102   Cbgd_Css 0.000001  20.000    1_4_16    1_4_16
140 1_4_17        103   Cbgd_Css 0.000001  25.000    1_4_17    1_4_17
141 1_4_18        104   Cbgd_Css 0.000001  38.000    1_4_18    1_4_18
142 1_4_19        105   Cbgd_Css 0.000001 160.000    1_4_19    1_4_19
143 1_4_20        106   Cbgd_Css 0.000001  32.000    1_4_20    1_4_20
144 1_4_21        107   Cbgd_Css 0.000001   7.000    1_4_21    1_4_21
145 1_4_22        108   Cbgd_Css 0.000001  28.000    1_4_22    1_4_22
146 1_4_23        109   Cbgd_Css 0.000001  40.000    1_4_23    1_4_23
147 1_4_24        110   Cbgd_Css 0.000001  12.000    1_4_24    1_4_24
148 1_4_25        111   Cbgd_Css 0.000001  80.000    1_4_25    1_4_25
149 1_4_26        112   Cbgd_Css 0.000001  90.000    1_4_26    1_4_26
150 1_4_27        113   Cbgd_Css 0.000001  22.000    1_4_27    1_4_27
151 1_4_28        114   Cbgd_Css 0.000001  50.000    1_4_28    1_4_28
152 1_4_29        115   Cbgd_Css 0.000001  21.000    1_4_29    1_4_29
153 1_4_30        116   Cbgd_Css 0.000001  60.000    1_4_30    1_4_30
154 1_4_31        117   Cbgd_Css 0.000001  61.000    1_4_31    1_4_31
155 1_4_32        118   Cbgd_Css 0.000001 120.000    1_4_32    1_4_32
156 1_4_33        119   Cbgd_Css 0.000001  18.000    1_4_33    1_4_33
157 1_4_34        120   Cbgd_Css 0.000001  35.000    1_4_34    1_4_34
158 1_4_35        121   Cbgd_Css 0.000001  68.000    1_4_35    1_4_35
159 1_4_36        122   Cbgd_Css 0.000001  35.000    1_4_36    1_4_36
160 1_4_37        123   Cbgd_Css 0.000001  53.000    1_4_37    1_4_37
161 1_4_38        124   Cbgd_Css 0.000001  35.000    1_4_38    1_4_38
162 1_4_39        125   Cbgd_Css 0.000001  57.000    1_4_39    1_4_39
163 1_4_40        126   Cbgd_Css 0.000001  58.000    1_4_40    1_4_40
164 1_4_41        127   Cbgd_Css 0.000001  71.000    1_4_41    1_4_41
165 1_4_42        128   Cbgd_Css 0.000001  65.000    1_4_42    1_4_42
166 1_4_43        129   Cbgd_Css 0.000001  18.000    1_4_43    1_4_43
167 1_4_44        130   Cbgd_Css 0.000001  40.000    1_4_44    1_4_44
168 1_4_45        131   Cbgd_Css 0.000001  26.000    1_4_45    1_4_45
169 1_4_46        132   Cbgd_Css 0.000001  90.000    1_4_46    1_4_46
170 1_4_47        133   Cbgd_Css 0.000001  91.000    1_4_47    1_4_47
171 1_4_48        134   Cbgd_Css 0.000001 180.000    1_4_48    1_4_48
172 1_4_49        135   Cbgd_Css 0.000001 130.000    1_4_49    1_4_49
173  1_5_1        136 M_Cbgd_Css 2.200000   7.690     1_5_1     1_5_1
174  1_6_1        137 M_Cbgd_Css 2.000000  24.639     1_6_1     1_6_1
175  1_7_1        138 M_Cbgd_Css 2.000000  21.378     1_7_1     1_7_1
176  1_8_1        139 M_Cbgd_Css 2.000000  20.754     1_8_1     1_8_1
             dataset               Sex       City Train_Test   datatype
1    Decatur M Train            Female    Decatur      Train Individual
2    Decatur M Train            Female    Decatur      Train Individual
3    Decatur M Train            Female    Decatur      Train Individual
4    Decatur M Train            Female    Decatur      Train Individual
5    Decatur M Train            Female    Decatur      Train Individual
6    Decatur M Train            Female    Decatur      Train Individual
7    Decatur M Train            Female    Decatur      Train Individual
8    Decatur M Train            Female    Decatur      Train Individual
9    Decatur M Train            Female    Decatur      Train Individual
10   Decatur M Train            Female    Decatur      Train Individual
11   Decatur M Train            Female    Decatur      Train Individual
12   Decatur M Train            Female    Decatur      Train Individual
13   Decatur M Train            Female    Decatur      Train Individual
14   Decatur M Train            Female    Decatur      Train Individual
15   Decatur M Train            Female    Decatur      Train Individual
16   Decatur M Train            Female    Decatur      Train Individual
17   Decatur M Train            Female    Decatur      Train Individual
18   Decatur M Train            Female    Decatur      Train Individual
19   Decatur F Train              Male    Decatur      Train Individual
20   Decatur F Train              Male    Decatur      Train Individual
21   Decatur F Train              Male    Decatur      Train Individual
22   Decatur F Train              Male    Decatur      Train Individual
23   Decatur F Train              Male    Decatur      Train Individual
24   Decatur F Train              Male    Decatur      Train Individual
25   Decatur F Train              Male    Decatur      Train Individual
26   Decatur F Train              Male    Decatur      Train Individual
27   Decatur F Train              Male    Decatur      Train Individual
28   Decatur F Train              Male    Decatur      Train Individual
29   Decatur F Train              Male    Decatur      Train Individual
30   Decatur F Train              Male    Decatur      Train Individual
31   Decatur F Train              Male    Decatur      Train Individual
32   Decatur F Train              Male    Decatur      Train Individual
33   Decatur F Train              Male    Decatur      Train Individual
34   Decatur F Train              Male    Decatur      Train Individual
35   Decatur F Train              Male    Decatur      Train Individual
36   Decatur F Train              Male    Decatur      Train Individual
37    Decatur M Test            Female    Decatur       Test Individual
38    Decatur M Test            Female    Decatur       Test Individual
39    Decatur M Test            Female    Decatur       Test Individual
40    Decatur M Test            Female    Decatur       Test Individual
41    Decatur M Test            Female    Decatur       Test Individual
42    Decatur M Test            Female    Decatur       Test Individual
43    Decatur M Test            Female    Decatur       Test Individual
44    Decatur M Test            Female    Decatur       Test Individual
45    Decatur M Test            Female    Decatur       Test Individual
46    Decatur M Test            Female    Decatur       Test Individual
47    Decatur M Test            Female    Decatur       Test Individual
48    Decatur M Test            Female    Decatur       Test Individual
49    Decatur M Test            Female    Decatur       Test Individual
50    Decatur M Test            Female    Decatur       Test Individual
51    Decatur M Test            Female    Decatur       Test Individual
52    Decatur M Test            Female    Decatur       Test Individual
53    Decatur M Test            Female    Decatur       Test Individual
54    Decatur M Test            Female    Decatur       Test Individual
55    Decatur F Test              Male    Decatur       Test Individual
56    Decatur F Test              Male    Decatur       Test Individual
57    Decatur F Test              Male    Decatur       Test Individual
58    Decatur F Test              Male    Decatur       Test Individual
59    Decatur F Test              Male    Decatur       Test Individual
60    Decatur F Test              Male    Decatur       Test Individual
61    Decatur F Test              Male    Decatur       Test Individual
62    Decatur F Test              Male    Decatur       Test Individual
63    Decatur F Test              Male    Decatur       Test Individual
64    Decatur F Test              Male    Decatur       Test Individual
65    Decatur F Test              Male    Decatur       Test Individual
66    Decatur F Test              Male    Decatur       Test Individual
67    Decatur F Test              Male    Decatur       Test Individual
68    Decatur F Test              Male    Decatur       Test Individual
69    Decatur F Test              Male    Decatur       Test Individual
70    Decatur F Test              Male    Decatur       Test Individual
71    Decatur F Test              Male    Decatur       Test Individual
72    Decatur F Test              Male    Decatur       Test Individual
73    Decatur F Test              Male    Decatur       Test Individual
74    Decatur F Test              Male    Decatur       Test Individual
75   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
76   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
77   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
78   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
79   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
80   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
81   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
82   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
83   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
84   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
85   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
86   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
87   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
88   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
89   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
90   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
91   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
92   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
93   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
94   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
95   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
96   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
97   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
98   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
99   Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
100  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
101  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
102  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
103  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
104  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
105  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
106  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
107  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
108  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
109  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
110  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
111  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
112  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
113  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
114  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
115  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
116  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
117  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
118  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
119  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
120  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
121  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
122  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
123  Minnesota Train Mixed (all sexes)  Minnesota      Train Individual
124   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
125   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
126   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
127   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
128   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
129   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
130   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
131   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
132   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
133   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
134   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
135   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
136   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
137   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
138   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
139   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
140   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
141   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
142   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
143   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
144   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
145   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
146   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
147   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
148   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
149   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
150   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
151   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
152   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
153   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
154   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
155   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
156   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
157   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
158   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
159   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
160   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
161   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
162   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
163   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
164   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
165   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
166   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
167   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
168   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
169   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
170   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
171   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
172   Minnesota Test Mixed (all sexes)  Minnesota       Test Individual
173  Paulsboro-Train Mixed (all sexes)  Paulsboro      Train    Summary
174    Horsham-Train Mixed (all sexes)    Horsham      Train    Summary
175  Warminster-Test Mixed (all sexes) Warminster       Test    Summary
176 Warrington-Train Mixed (all sexes) Warrington       Test    Summary
                variable              Dataset   Time.desc
1      Decatur M Train 1    Decatur M Train 1         T=0
2      Decatur M Train 1    Decatur M Train 1     T=5.802
3      Decatur M Train 2    Decatur M Train 2         T=0
4      Decatur M Train 2    Decatur M Train 2     T=5.802
5      Decatur M Train 3    Decatur M Train 3         T=0
6      Decatur M Train 3    Decatur M Train 3     T=5.802
7      Decatur M Train 4    Decatur M Train 4         T=0
8      Decatur M Train 4    Decatur M Train 4     T=5.802
9      Decatur M Train 5    Decatur M Train 5         T=0
10     Decatur M Train 5    Decatur M Train 5     T=5.802
11     Decatur M Train 6    Decatur M Train 6         T=0
12     Decatur M Train 6    Decatur M Train 6     T=5.802
13     Decatur M Train 7    Decatur M Train 7         T=0
14     Decatur M Train 7    Decatur M Train 7     T=5.802
15     Decatur M Train 8    Decatur M Train 8         T=0
16     Decatur M Train 8    Decatur M Train 8     T=5.802
17     Decatur M Train 9    Decatur M Train 9         T=0
18     Decatur M Train 9    Decatur M Train 9     T=5.802
19    Decatur F Train 10   Decatur F Train 10         T=0
20    Decatur F Train 10   Decatur F Train 10     T=5.802
21    Decatur F Train 11   Decatur F Train 11         T=0
22    Decatur F Train 11   Decatur F Train 11     T=5.802
23    Decatur F Train 12   Decatur F Train 12         T=0
24    Decatur F Train 12   Decatur F Train 12     T=5.802
25    Decatur F Train 13   Decatur F Train 13         T=0
26    Decatur F Train 13   Decatur F Train 13     T=5.802
27    Decatur F Train 14   Decatur F Train 14         T=0
28    Decatur F Train 14   Decatur F Train 14     T=5.802
29    Decatur F Train 15   Decatur F Train 15         T=0
30    Decatur F Train 15   Decatur F Train 15     T=5.802
31    Decatur F Train 16   Decatur F Train 16         T=0
32    Decatur F Train 16   Decatur F Train 16     T=5.802
33    Decatur F Train 17   Decatur F Train 17         T=0
34    Decatur F Train 17   Decatur F Train 17     T=5.802
35    Decatur F Train 18   Decatur F Train 18         T=0
36    Decatur F Train 18   Decatur F Train 18     T=5.802
37     Decatur M Test 19    Decatur M Test 19         T=0
38     Decatur M Test 19    Decatur M Test 19     T=5.802
39     Decatur M Test 20    Decatur M Test 20         T=0
40     Decatur M Test 20    Decatur M Test 20     T=5.802
41     Decatur M Test 21    Decatur M Test 21         T=0
42     Decatur M Test 21    Decatur M Test 21     T=5.802
43     Decatur M Test 22    Decatur M Test 22         T=0
44     Decatur M Test 22    Decatur M Test 22     T=5.802
45     Decatur M Test 23    Decatur M Test 23         T=0
46     Decatur M Test 23    Decatur M Test 23     T=5.802
47     Decatur M Test 24    Decatur M Test 24         T=0
48     Decatur M Test 24    Decatur M Test 24     T=5.802
49     Decatur M Test 25    Decatur M Test 25         T=0
50     Decatur M Test 25    Decatur M Test 25     T=5.802
51     Decatur M Test 26    Decatur M Test 26         T=0
52     Decatur M Test 26    Decatur M Test 26     T=5.802
53     Decatur M Test 27    Decatur M Test 27         T=0
54     Decatur M Test 27    Decatur M Test 27     T=5.802
55     Decatur F Test 28    Decatur F Test 28         T=0
56     Decatur F Test 28    Decatur F Test 28     T=5.802
57     Decatur F Test 29    Decatur F Test 29         T=0
58     Decatur F Test 29    Decatur F Test 29     T=5.802
59     Decatur F Test 30    Decatur F Test 30         T=0
60     Decatur F Test 30    Decatur F Test 30     T=5.802
61     Decatur F Test 31    Decatur F Test 31         T=0
62     Decatur F Test 31    Decatur F Test 31     T=5.802
63     Decatur F Test 32    Decatur F Test 32         T=0
64     Decatur F Test 32    Decatur F Test 32     T=5.802
65     Decatur F Test 33    Decatur F Test 33         T=0
66     Decatur F Test 33    Decatur F Test 33     T=5.802
67     Decatur F Test 34    Decatur F Test 34         T=0
68     Decatur F Test 34    Decatur F Test 34     T=5.802
69     Decatur F Test 35    Decatur F Test 35         T=0
70     Decatur F Test 35    Decatur F Test 35     T=5.802
71     Decatur F Test 36    Decatur F Test 36         T=0
72     Decatur F Test 36    Decatur F Test 36     T=5.802
73     Decatur F Test 37    Decatur F Test 37         T=0
74     Decatur F Test 37    Decatur F Test 37     T=5.802
75    Minnesota Train 38   Minnesota Train 38 SteadyState
76    Minnesota Train 39   Minnesota Train 39 SteadyState
77    Minnesota Train 40   Minnesota Train 40 SteadyState
78    Minnesota Train 41   Minnesota Train 41 SteadyState
79    Minnesota Train 42   Minnesota Train 42 SteadyState
80    Minnesota Train 43   Minnesota Train 43 SteadyState
81    Minnesota Train 44   Minnesota Train 44 SteadyState
82    Minnesota Train 45   Minnesota Train 45 SteadyState
83    Minnesota Train 46   Minnesota Train 46 SteadyState
84    Minnesota Train 47   Minnesota Train 47 SteadyState
85    Minnesota Train 48   Minnesota Train 48 SteadyState
86    Minnesota Train 49   Minnesota Train 49 SteadyState
87    Minnesota Train 50   Minnesota Train 50 SteadyState
88    Minnesota Train 51   Minnesota Train 51 SteadyState
89    Minnesota Train 52   Minnesota Train 52 SteadyState
90    Minnesota Train 53   Minnesota Train 53 SteadyState
91    Minnesota Train 54   Minnesota Train 54 SteadyState
92    Minnesota Train 55   Minnesota Train 55 SteadyState
93    Minnesota Train 56   Minnesota Train 56 SteadyState
94    Minnesota Train 57   Minnesota Train 57 SteadyState
95    Minnesota Train 58   Minnesota Train 58 SteadyState
96    Minnesota Train 59   Minnesota Train 59 SteadyState
97    Minnesota Train 60   Minnesota Train 60 SteadyState
98    Minnesota Train 61   Minnesota Train 61 SteadyState
99    Minnesota Train 62   Minnesota Train 62 SteadyState
100   Minnesota Train 63   Minnesota Train 63 SteadyState
101   Minnesota Train 64   Minnesota Train 64 SteadyState
102   Minnesota Train 65   Minnesota Train 65 SteadyState
103   Minnesota Train 66   Minnesota Train 66 SteadyState
104   Minnesota Train 67   Minnesota Train 67 SteadyState
105   Minnesota Train 68   Minnesota Train 68 SteadyState
106   Minnesota Train 69   Minnesota Train 69 SteadyState
107   Minnesota Train 70   Minnesota Train 70 SteadyState
108   Minnesota Train 71   Minnesota Train 71 SteadyState
109   Minnesota Train 72   Minnesota Train 72 SteadyState
110   Minnesota Train 73   Minnesota Train 73 SteadyState
111   Minnesota Train 74   Minnesota Train 74 SteadyState
112   Minnesota Train 75   Minnesota Train 75 SteadyState
113   Minnesota Train 76   Minnesota Train 76 SteadyState
114   Minnesota Train 77   Minnesota Train 77 SteadyState
115   Minnesota Train 78   Minnesota Train 78 SteadyState
116   Minnesota Train 79   Minnesota Train 79 SteadyState
117   Minnesota Train 80   Minnesota Train 80 SteadyState
118   Minnesota Train 81   Minnesota Train 81 SteadyState
119   Minnesota Train 82   Minnesota Train 82 SteadyState
120   Minnesota Train 83   Minnesota Train 83 SteadyState
121   Minnesota Train 84   Minnesota Train 84 SteadyState
122   Minnesota Train 85   Minnesota Train 85 SteadyState
123   Minnesota Train 86   Minnesota Train 86 SteadyState
124    Minnesota Test 87    Minnesota Test 87 SteadyState
125    Minnesota Test 88    Minnesota Test 88 SteadyState
126    Minnesota Test 89    Minnesota Test 89 SteadyState
127    Minnesota Test 90    Minnesota Test 90 SteadyState
128    Minnesota Test 91    Minnesota Test 91 SteadyState
129    Minnesota Test 92    Minnesota Test 92 SteadyState
130    Minnesota Test 93    Minnesota Test 93 SteadyState
131    Minnesota Test 94    Minnesota Test 94 SteadyState
132    Minnesota Test 95    Minnesota Test 95 SteadyState
133    Minnesota Test 96    Minnesota Test 96 SteadyState
134    Minnesota Test 97    Minnesota Test 97 SteadyState
135    Minnesota Test 98    Minnesota Test 98 SteadyState
136    Minnesota Test 99    Minnesota Test 99 SteadyState
137   Minnesota Test 100   Minnesota Test 100 SteadyState
138   Minnesota Test 101   Minnesota Test 101 SteadyState
139   Minnesota Test 102   Minnesota Test 102 SteadyState
140   Minnesota Test 103   Minnesota Test 103 SteadyState
141   Minnesota Test 104   Minnesota Test 104 SteadyState
142   Minnesota Test 105   Minnesota Test 105 SteadyState
143   Minnesota Test 106   Minnesota Test 106 SteadyState
144   Minnesota Test 107   Minnesota Test 107 SteadyState
145   Minnesota Test 108   Minnesota Test 108 SteadyState
146   Minnesota Test 109   Minnesota Test 109 SteadyState
147   Minnesota Test 110   Minnesota Test 110 SteadyState
148   Minnesota Test 111   Minnesota Test 111 SteadyState
149   Minnesota Test 112   Minnesota Test 112 SteadyState
150   Minnesota Test 113   Minnesota Test 113 SteadyState
151   Minnesota Test 114   Minnesota Test 114 SteadyState
152   Minnesota Test 115   Minnesota Test 115 SteadyState
153   Minnesota Test 116   Minnesota Test 116 SteadyState
154   Minnesota Test 117   Minnesota Test 117 SteadyState
155   Minnesota Test 118   Minnesota Test 118 SteadyState
156   Minnesota Test 119   Minnesota Test 119 SteadyState
157   Minnesota Test 120   Minnesota Test 120 SteadyState
158   Minnesota Test 121   Minnesota Test 121 SteadyState
159   Minnesota Test 122   Minnesota Test 122 SteadyState
160   Minnesota Test 123   Minnesota Test 123 SteadyState
161   Minnesota Test 124   Minnesota Test 124 SteadyState
162   Minnesota Test 125   Minnesota Test 125 SteadyState
163   Minnesota Test 126   Minnesota Test 126 SteadyState
164   Minnesota Test 127   Minnesota Test 127 SteadyState
165   Minnesota Test 128   Minnesota Test 128 SteadyState
166   Minnesota Test 129   Minnesota Test 129 SteadyState
167   Minnesota Test 130   Minnesota Test 130 SteadyState
168   Minnesota Test 131   Minnesota Test 131 SteadyState
169   Minnesota Test 132   Minnesota Test 132 SteadyState
170   Minnesota Test 133   Minnesota Test 133 SteadyState
171   Minnesota Test 134   Minnesota Test 134 SteadyState
172   Minnesota Test 135   Minnesota Test 135 SteadyState
173  Paulsboro-Train 136  Paulsboro-Train 136       T=2.2
174    Horsham-Train 137    Horsham-Train 137         T=2
175  Warminster-Test 138  Warminster-Test 138         T=2
176 Warrington-Train 139 Warrington-Train 139         T=2
                      Dataset.Time
1            Decatur M Train 1.T=0
2        Decatur M Train 1.T=5.802
3            Decatur M Train 2.T=0
4        Decatur M Train 2.T=5.802
5            Decatur M Train 3.T=0
6        Decatur M Train 3.T=5.802
7            Decatur M Train 4.T=0
8        Decatur M Train 4.T=5.802
9            Decatur M Train 5.T=0
10       Decatur M Train 5.T=5.802
11           Decatur M Train 6.T=0
12       Decatur M Train 6.T=5.802
13           Decatur M Train 7.T=0
14       Decatur M Train 7.T=5.802
15           Decatur M Train 8.T=0
16       Decatur M Train 8.T=5.802
17           Decatur M Train 9.T=0
18       Decatur M Train 9.T=5.802
19          Decatur F Train 10.T=0
20      Decatur F Train 10.T=5.802
21          Decatur F Train 11.T=0
22      Decatur F Train 11.T=5.802
23          Decatur F Train 12.T=0
24      Decatur F Train 12.T=5.802
25          Decatur F Train 13.T=0
26      Decatur F Train 13.T=5.802
27          Decatur F Train 14.T=0
28      Decatur F Train 14.T=5.802
29          Decatur F Train 15.T=0
30      Decatur F Train 15.T=5.802
31          Decatur F Train 16.T=0
32      Decatur F Train 16.T=5.802
33          Decatur F Train 17.T=0
34      Decatur F Train 17.T=5.802
35          Decatur F Train 18.T=0
36      Decatur F Train 18.T=5.802
37           Decatur M Test 19.T=0
38       Decatur M Test 19.T=5.802
39           Decatur M Test 20.T=0
40       Decatur M Test 20.T=5.802
41           Decatur M Test 21.T=0
42       Decatur M Test 21.T=5.802
43           Decatur M Test 22.T=0
44       Decatur M Test 22.T=5.802
45           Decatur M Test 23.T=0
46       Decatur M Test 23.T=5.802
47           Decatur M Test 24.T=0
48       Decatur M Test 24.T=5.802
49           Decatur M Test 25.T=0
50       Decatur M Test 25.T=5.802
51           Decatur M Test 26.T=0
52       Decatur M Test 26.T=5.802
53           Decatur M Test 27.T=0
54       Decatur M Test 27.T=5.802
55           Decatur F Test 28.T=0
56       Decatur F Test 28.T=5.802
57           Decatur F Test 29.T=0
58       Decatur F Test 29.T=5.802
59           Decatur F Test 30.T=0
60       Decatur F Test 30.T=5.802
61           Decatur F Test 31.T=0
62       Decatur F Test 31.T=5.802
63           Decatur F Test 32.T=0
64       Decatur F Test 32.T=5.802
65           Decatur F Test 33.T=0
66       Decatur F Test 33.T=5.802
67           Decatur F Test 34.T=0
68       Decatur F Test 34.T=5.802
69           Decatur F Test 35.T=0
70       Decatur F Test 35.T=5.802
71           Decatur F Test 36.T=0
72       Decatur F Test 36.T=5.802
73           Decatur F Test 37.T=0
74       Decatur F Test 37.T=5.802
75  Minnesota Train 38.SteadyState
76  Minnesota Train 39.SteadyState
77  Minnesota Train 40.SteadyState
78  Minnesota Train 41.SteadyState
79  Minnesota Train 42.SteadyState
80  Minnesota Train 43.SteadyState
81  Minnesota Train 44.SteadyState
82  Minnesota Train 45.SteadyState
83  Minnesota Train 46.SteadyState
84  Minnesota Train 47.SteadyState
85  Minnesota Train 48.SteadyState
86  Minnesota Train 49.SteadyState
87  Minnesota Train 50.SteadyState
88  Minnesota Train 51.SteadyState
89  Minnesota Train 52.SteadyState
90  Minnesota Train 53.SteadyState
91  Minnesota Train 54.SteadyState
92  Minnesota Train 55.SteadyState
93  Minnesota Train 56.SteadyState
94  Minnesota Train 57.SteadyState
95  Minnesota Train 58.SteadyState
96  Minnesota Train 59.SteadyState
97  Minnesota Train 60.SteadyState
98  Minnesota Train 61.SteadyState
99  Minnesota Train 62.SteadyState
100 Minnesota Train 63.SteadyState
101 Minnesota Train 64.SteadyState
102 Minnesota Train 65.SteadyState
103 Minnesota Train 66.SteadyState
104 Minnesota Train 67.SteadyState
105 Minnesota Train 68.SteadyState
106 Minnesota Train 69.SteadyState
107 Minnesota Train 70.SteadyState
108 Minnesota Train 71.SteadyState
109 Minnesota Train 72.SteadyState
110 Minnesota Train 73.SteadyState
111 Minnesota Train 74.SteadyState
112 Minnesota Train 75.SteadyState
113 Minnesota Train 76.SteadyState
114 Minnesota Train 77.SteadyState
115 Minnesota Train 78.SteadyState
116 Minnesota Train 79.SteadyState
117 Minnesota Train 80.SteadyState
118 Minnesota Train 81.SteadyState
119 Minnesota Train 82.SteadyState
120 Minnesota Train 83.SteadyState
121 Minnesota Train 84.SteadyState
122 Minnesota Train 85.SteadyState
123 Minnesota Train 86.SteadyState
124  Minnesota Test 87.SteadyState
125  Minnesota Test 88.SteadyState
126  Minnesota Test 89.SteadyState
127  Minnesota Test 90.SteadyState
128  Minnesota Test 91.SteadyState
129  Minnesota Test 92.SteadyState
130  Minnesota Test 93.SteadyState
131  Minnesota Test 94.SteadyState
132  Minnesota Test 95.SteadyState
133  Minnesota Test 96.SteadyState
134  Minnesota Test 97.SteadyState
135  Minnesota Test 98.SteadyState
136  Minnesota Test 99.SteadyState
137 Minnesota Test 100.SteadyState
138 Minnesota Test 101.SteadyState
139 Minnesota Test 102.SteadyState
140 Minnesota Test 103.SteadyState
141 Minnesota Test 104.SteadyState
142 Minnesota Test 105.SteadyState
143 Minnesota Test 106.SteadyState
144 Minnesota Test 107.SteadyState
145 Minnesota Test 108.SteadyState
146 Minnesota Test 109.SteadyState
147 Minnesota Test 110.SteadyState
148 Minnesota Test 111.SteadyState
149 Minnesota Test 112.SteadyState
150 Minnesota Test 113.SteadyState
151 Minnesota Test 114.SteadyState
152 Minnesota Test 115.SteadyState
153 Minnesota Test 116.SteadyState
154 Minnesota Test 117.SteadyState
155 Minnesota Test 118.SteadyState
156 Minnesota Test 119.SteadyState
157 Minnesota Test 120.SteadyState
158 Minnesota Test 121.SteadyState
159 Minnesota Test 122.SteadyState
160 Minnesota Test 123.SteadyState
161 Minnesota Test 124.SteadyState
162 Minnesota Test 125.SteadyState
163 Minnesota Test 126.SteadyState
164 Minnesota Test 127.SteadyState
165 Minnesota Test 128.SteadyState
166 Minnesota Test 129.SteadyState
167 Minnesota Test 130.SteadyState
168 Minnesota Test 131.SteadyState
169 Minnesota Test 132.SteadyState
170 Minnesota Test 133.SteadyState
171 Minnesota Test 134.SteadyState
172 Minnesota Test 135.SteadyState
173      Paulsboro-Train 136.T=2.2
174          Horsham-Train 137.T=2
175        Warminster-Test 138.T=2
176       Warrington-Train 139.T=2
#Multicheck plot

# Split Steady State Group into different populations for boxplot grouping
#df_check[df_check$Time.desc == "SteadyState" & grepl("Lubeck",df_check$Dataset),]$Time.desc <- "Lubeck"
#df_check[df_check$Time.desc == "SteadyState" & grepl("Little Hocking",df_check$Dataset),]$Time.desc <- "Little Hocking"

Modify aesthetics lookup table for boxplots

##  additional source aesthetic lookup table for grey-scale time (years);  merged legends save space on plotting output
times <- df_check%>% select(Time.desc, Time) %>%  unique () %>% 
  mutate(rank = rank(Time) , grey = grey.colors(start=1,end=0.4, n = n()),
         alpha = (rank)/8) %>% 
  select(-Time)
 
df_check <- df_check %>% mutate (legend_label = (paste0(City, "\n", Time.desc ) )) # add legend-labels
aes_lut <- df_check %>% 
  select(City, Train_Test, datatype,Time, Time.desc, legend_label) %>% unique () %>%
   left_join(aes_lut[, c("City", "cols")], by = "City") %>% ungroup () %>% unique ()%>%
   left_join (times, by = "Time.desc") %>% 
   arrange(datatype, City, Train_Test, Time)    %>% 
   mutate(alpha = if_else(City == "Horsham", alpha/2, alpha)) %>% # otherwise too dark with this color
  mutate_if(is.factor, as.character) 

Decatur boxplots

Changed grey start to 1 instead of 0.8, end at 0.6 instead of 0.4. Changed shape of symbols so they are filled.

 #CD
 # Decatur 
df_decat  <- df_check %>%   
  filter(City == "Decatur" & Train_Test %in% c ("Train", "Test")) %>% 
  mutate(panel = ordered (Train_Test, levels = c ("Train", "Test"), 
                          labels = c("C: PFOS Decatur Train", "D: PFOS Decatur Test") ))

aes_lut_df_df_decat <- aes_lut %>% 
  filter(City == "Decatur" & Train_Test %in% c ("Train", "Test")) %>% 
  mutate_if(is.factor, as.character) 

source( paste0(gsub(basename(here()), 'shared_functions', here()), '/plot_sum_boxplot.r'))

plt_train <- plot_sum_boxplot   (dframe = df_decat, aes_lut= aes_lut_df_df_decat, facets = TRUE , pfas_nom = pfas_name     ) 
print(plt_train)

ggsave(here ("output-plots",paste0( sa,"DecaturTrainTestboxplot",pfas_name,".pdf")),plt_train,dpi=600)
Saving 6.5 x 3.5 in image
ggsave(here ("output-plots",paste0( sa,"DecaturTrainTestboxplot",pfas_name,".png")),plt_train,dpi=600)
Saving 6.5 x 3.5 in image

All boxplots

Changed grey start to 1 instead of 0.8, end at 0.6 instead of 0.4. Added shapes and fills to data points.

lets <- LETTERS;
names(lets)[1:(length(unique(df_check$dataset))-4)]<-as.character(unique(df_check$dataset))[5:length(unique(df_check$dataset))]

for (d in unique(df_check$dataset)) { # d = unique(df_check$dataset)[11]
    ddset <- df_check %>%    
    filter(dataset == d) 
    
    aes_lut_ddset <- ddset %>% select(legend_label,  City,Train_Test,datatype, Time.desc  ) %>% unique () %>% inner_join(aes_lut)
      
    gt <- ifelse(is.na(lets[d]),d,paste0(lets[d],": ", d))
    plt <- plot_sum_boxplot(dframe = ddset, aes_lut= aes_lut_ddset, gtitle= gt, facets = FALSE, pfas_nom = pfas_name)
     
  print(plt)
  ggsave(here ("output-plots",
                paste0( sa, d,"-boxplot-", 
                pfas_name,".pdf")) ,
         plt,dpi=600)
  
    ggsave(here ("output-plots",
                paste0( sa, d,"-boxplot-", 
                pfas_name,".png")) ,
         plt,dpi=600)

}
Joining, by = c("legend_label", "City", "Train_Test", "datatype", "Time.desc")
Saving 6.5 x 3.5 in image
Saving 6.5 x 3.5 in image
Joining, by = c("legend_label", "City", "Train_Test", "datatype", "Time.desc")

Saving 6.5 x 3.5 in image
Saving 6.5 x 3.5 in image
Joining, by = c("legend_label", "City", "Train_Test", "datatype", "Time.desc")

Saving 6.5 x 3.5 in image
Saving 6.5 x 3.5 in image
Joining, by = c("legend_label", "City", "Train_Test", "datatype", "Time.desc")

Saving 6.5 x 3.5 in image
Saving 6.5 x 3.5 in image
Joining, by = c("legend_label", "City", "Train_Test", "datatype", "Time.desc")

Saving 6.5 x 3.5 in image
Saving 6.5 x 3.5 in image
Joining, by = c("legend_label", "City", "Train_Test", "datatype", "Time.desc")

Saving 6.5 x 3.5 in image
Saving 6.5 x 3.5 in image
Joining, by = c("legend_label", "City", "Train_Test", "datatype", "Time.desc")

Saving 6.5 x 3.5 in image
Saving 6.5 x 3.5 in image
Joining, by = c("legend_label", "City", "Train_Test", "datatype", "Time.desc")

Saving 6.5 x 3.5 in image
Saving 6.5 x 3.5 in image
Joining, by = c("legend_label", "City", "Train_Test", "datatype", "Time.desc")

Saving 6.5 x 3.5 in image
Saving 6.5 x 3.5 in image
Joining, by = c("legend_label", "City", "Train_Test", "datatype", "Time.desc")

Saving 6.5 x 3.5 in image
Saving 6.5 x 3.5 in image

### make Training plot  

df_d_trt <- df_check %>%   
     filter( (Train_Test == "Train") & ((Output_Var == "M_Cbgd_Css") | (Output_Var == "M_Cserum"))) %>%
     mutate_if(is.factor, as.character) %>%  # drop factor levels unused
     mutate(Dataset.Time = factor(Dataset.Time)) 
 

 aes_lut_df_d_trt <-  df_d_trt %>% select(City, datatype,Time, Time.desc, legend_label) %>% 
   inner_join(aes_lut  ) %>% 
   select(-Train_Test) %>% ungroup () %>% unique ()  
Joining, by = c("City", "datatype", "Time", "Time.desc", "legend_label")
plt_train <-    plot_sum_boxplot(dframe = df_d_trt, aes_lut= aes_lut_df_d_trt,   
                                 gtitle="C: Summary Data - Train" , facets = FALSE, 
                                 pfas_nom = pfas_name )
  print(plt_train)

  ggsave(here ("output-plots", paste0( sa, "SummaryTrainDataboxplot",pfas_name,".pdf")), plt_train,dpi=600)
Saving 6.5 x 3.5 in image
   ggsave(here ("output-plots", paste0( sa, "SummaryTrainDataboxplot",pfas_name,".png")), plt_train,dpi=600)
Saving 6.5 x 3.5 in image
###  make Test plot
df_d_test <- df_check %>%   
    filter((Train_Test == "Test") & 
             ((Output_Var == "M_Cbgd_Css") | (Output_Var == "M_Cserum")))  %>%
     mutate_if(is.factor, as.character) %>%  # drop factor levels unused
     mutate(Dataset.Time = factor(Dataset.Time)) 

aes_lut_df_d_test <-  df_d_test %>% select(City, datatype,Time, Time.desc, legend_label) %>% 
   inner_join(aes_lut  ) %>% 
   select(-Train_Test) %>% ungroup () %>% unique ()  
Joining, by = c("City", "datatype", "Time", "Time.desc", "legend_label")
plt_test <- plot_sum_boxplot(dframe = df_d_test, aes_lut= aes_lut_df_d_test, 
                             gtitle="D: Summary Data - Test", facets = FALSE , 
                             pfas_nom = pfas_name)
  print(plt_test)

  ggsave(here ("output-plots",paste0( sa, "SummaryTestDataboxplot",pfas_name,".pdf")), plt_test,dpi=600)
Saving 6.5 x 3.5 in image
  ggsave(here ("output-plots",paste0( sa, "SummaryTestDataboxplot",pfas_name,".png")), plt_test,dpi=600)
Saving 6.5 x 3.5 in image

PFOS

Background posteriors

Shows shift in background estimate.

gmscale<-0.8

dat <- multicheck$parms.samp[,grep("M_ln_Cbgd",names(multicheck$parms.samp))]
datasetnames <- as.character(unique(calibdata$dataset))
datasetnames <- gsub(" M","",datasetnames)
datasetnames <- gsub(" F","",datasetnames)
datasetnames<-datasetnames[!duplicated(datasetnames)]
names(dat) <- datasetnames
dat <- dat[,grep("Train",names(dat))]
dat.df <- pivot_longer(dat,1:ncol(dat))
dat.df <- rbind(dat.df,
                data.frame(name="Prior",value=rnorm(5000,m=log(gmscale),sd=0.4055)))
dat.df$name <- factor(dat.df$name,levels=rev(
                        c("Prior",datasetnames[grep("Train",datasetnames)])))
dat.df$value <- exp(dat.df$value)

p<-ggplot(dat.df)+
  #geom_violin(aes(x=name,y=value,fill=name=="Prior"))+
  geom_boxplot(aes(x=name,y=value,fill=name=="Prior"),outlier.shape=NA)+
  scale_y_log10()+coord_flip()+
    scale_fill_manual(name=NULL, 
                    values=c("#009988", "#EE7733" )) +
  theme_classic() +  
  geom_hline(yintercept = gmscale,color="grey")+
  theme(legend.position="none",
      panel.background = element_rect(color="black",size=1))+
  ylab("Posterior shift in Background Concentration")

print(p)

ggsave(here ("output-plots",paste0( sa,"PFOS_GM_Cbgd.pdf"))  , p, dpi=600)
Saving 5 x 6 in image
ggsave(here ("output-plots",paste0( sa,"PFOS_GM_Cbgd.png"))  , p, dpi=600)
Saving 5 x 6 in image

Half-life

For PFOS, the population GM of the half-life has a posterior distribution that is narrower than the prior, with a posterior median (95% CI) estimate of 3.06 (2.16-4.37) years. The population GSD posterior is larger than the prior at 1.47(1.44-1.75).

dat <- multicheck$parms.samp[,c("M_ln_k.1.","V_ln_k.1.", "M_ln_Vd.1.", "SD_ln_Vd.1.")]
names(dat) <- c("M_ln_k(1)","V_ln_k(1)", "M_ln_Vd(1)", "SD_ln_Vd(1)")
  
set.seed(3.14159)
dat$z_ln_k <- rnorm(nrow(dat))
dat$z_ln_Vd <- rnorm(nrow(dat))
dat %>% rename_()
dat$ln_k_i <- dat$`M_ln_k(1)` + sqrt(dat$`V_ln_k(1)`)*dat$z_ln_k
dat$ln_Vd_i <- dat$`M_ln_Vd(1)`+ dat$`SD_ln_Vd(1)`*dat$z_ln_Vd
linmod <- lm(ln_Vd_i ~ ln_k_i,data=dat)
ggplot(dat) + geom_point(aes(ln_k_i,ln_Vd_i)) + 
  labs(subtitle=paste("Adj R2 =",signif(summary(linmod)$adj.r.squared,2)))

Check normality

qqnorm(dat$ln_k_i,main="ln k Q-Q Normal")
qqline(dat$ln_k_i,col="red")

plot(ecdf(dat$ln_k_i))
x <- seq(-3,1,0.01)
m_ln_k_i <-   mean(dat$ln_k_i)
sd_ln_k_i <- sd(dat$ln_k_i)
lines(x,pnorm(x,mean=m_ln_k_i,sd=sd_ln_k_i),col="red")
text(m_ln_k_i-2*sd_ln_k_i,0.9,paste("m =",signif(m_ln_k_i,4),"\nsd =",signif(sd_ln_k_i,4)))

qqnorm(dat$ln_Vd_i,main="ln Vd Q-Q Normal")
qqline(dat$ln_Vd_i,col="red")

plot(ecdf(dat$ln_Vd_i))
x <- seq(-3,1,0.01)
m_ln_Vd_i <- mean(dat$ln_Vd_i)
sd_ln_Vd_i <- sd(dat$ln_Vd_i)

lines(x,pnorm(x,mean=m_ln_Vd_i,sd=sd_ln_Vd_i),col="red")
text(m_ln_Vd_i-2*sd_ln_Vd_i,0.9,paste("m =",signif(m_ln_Vd_i,4),"\nsd =",signif(sd_ln_Vd_i,4)))

Calculate table values for individual-level

hl_i <- log(2)/ exp(dat$ln_k_i) # individual half-life 
med_hl_i <- paste(signif (median (hl_i), 3)) # median of individual half-life
ci_med_hl_i <-   paste(signif (quantile(hl_i, prob=c(0.025,0.975)), 3),collapse="-") # 95ci med individual halflife
gm_hl_i <- paste(signif (exp(mean(log(hl_i))), 3)) # gm (which should be really close)
gsd_hl_i <- paste(signif (exp(sd(log(hl_i))), 3)) # gsd individual

med_Vd_i <- paste(signif (median(exp(dat$ln_Vd_i)), 3)) # median individual Vd
ci_med_Vd_i <-paste(signif (quantile(exp(dat$ln_Vd_i), prob=c(0.025,0.975)), 3),collapse="-") # 95ci med individual Vd
gm_vd_i <- paste(signif (exp(mean(dat$ln_Vd_i)), 3)) # gm (which should be really close)
gsd_vd_i<- paste(signif (exp(sd(dat$ln_Vd_i)), 3)) # gsd indiv


med_CL_i <- paste(signif (median(exp(dat$ln_Vd_i+dat$ln_k_i)), 3)) # median individual CL
ci_med_CL_i <-paste(signif (quantile(exp(dat$ln_Vd_i+dat$ln_k_i), prob=c(0.025,0.975)), 3),collapse="-") # 95ci med individual CL
ci98_med_CL_i <-paste(signif (quantile(exp(dat$ln_Vd_i+dat$ln_k_i), prob=c(0.01,0.99)), 3),collapse="-") # 98ci med individual CL
gm_CL_i <- paste(signif (exp(mean(dat$ln_Vd_i+dat$ln_k_i)), 3)) # gm (which should be really close)
gsd_CL_i<- paste(signif (exp(sd(dat$ln_Vd_i+dat$ln_k_i)), 3)) # gsd indiv
PFOS_priors <- data.frame(
  halflife_GM= log(2)/rlnorm(50000,
                             meanlog=-1.8971,sdlog=0.4055))
M_k <- exp(as.numeric(dat$`M_ln_k(1)`))
PFOS_halflife_GM <- log(2)/M_k

PFOS_hlgm_pr_med <- signif(median(PFOS_priors$halflife_GM,3))
PFOS_hlgm_pr_med_95ci <-paste(signif(quantile(PFOS_priors$halflife_GM,
                                            prob=c(0.025,0.975)),
                                   3),
                            collapse="-")

PFOS_hl_median_gm <- signif(median(PFOS_halflife_GM),3)
PFOS_hl_median_gm_95ci <- paste(signif(quantile(PFOS_halflife_GM,
                                            prob=c(0.025,0.975)),3),collapse="-")

p<-ggplot()+
  stat_density(aes(halflife_GM, color = "Prior"),data=PFOS_priors,geom="line",size=2)+
  stat_density(aes(PFOS_halflife_GM,stat(density),color="Posterior"),geom="line",size=1.5 )+
  xlim(0,15)+
  labs(title = bquote("C: PFOS"~T[1/2]~"Population GM")  ,
       subtitle=paste("Posterior Median (95% CI): ",
                      PFOS_hl_median_gm," (",
                      PFOS_hl_median_gm_95ci,
                      ")",sep=""))+
  xlab(bquote("Population GM"~T[1/2]~"(yrs)")) +
  scale_color_manual(name=NULL,#
                       values=c(Prior="#009988", Posterior="#EE7733" )) + 
  theme_classic() +  
  theme(legend.title = element_blank(),legend.position=c(0.8,0.7),
      panel.background = element_rect(color="black",size=1),
      legend.background = element_rect(fill="transparent", color=NA))
print(p)
Warning: Removed 80 rows containing non-finite values (stat_density).

ggsave(here ("output-plots",paste0( sa,"PFOS_hl_gm.pdf")), p, dpi=600)
Saving 4 x 2.5 in image
Warning: Removed 80 rows containing non-finite values (stat_density).
ggsave(here ("output-plots",paste0( sa,"PFOS_hl_gm.png")), p, dpi=600)
Saving 4 x 2.5 in image
Warning: Removed 80 rows containing non-finite values (stat_density).
PFOS_priors$halflife_GSD =  exp(sqrt(exp(rnorm(50000,m=log(0.1987),sd=log(1.267))))) 
PFOS_halflife_GSD <- exp(sqrt(dat$`V_ln_k(1)`))

PFOS_hlgsd_pr_med <- signif(median(PFOS_priors$halflife_GSD,3))
PFOS_hlgsd_pr_med_95ci <-paste(signif(quantile(PFOS_priors$halflife_GSD,
                                            prob=c(0.025,0.975)),
                                   3),
                            collapse="-")
PFOS_hl_gsd_med <- signif(median(PFOS_halflife_GSD),3)
PFOS_hl_gsd_med_95ci <- paste(signif(quantile(PFOS_halflife_GSD,
                                            prob=c(0.025,0.975)),3),collapse="-")
p<-ggplot()+
  stat_density(aes(halflife_GSD, color = "Prior"),data=PFOS_priors,geom="line",size=2)+
  stat_density(aes(PFOS_halflife_GSD,stat(density), color = "Posterior"),geom="line",size=1.5)+
  xlim(1,3)+
  labs(title = bquote("D: PFOS"~T[1/2]~"Population GSD"), 
       subtitle=paste("Posterior Median (95% CI): ",
                      PFOS_hl_gsd_med," (",
                      PFOS_hl_gsd_med_95ci,
                      ")",sep=""))+
  xlab(bquote("Population GSD"~T[1/2]))+
  scale_color_manual(name=NULL,#
                     values=c(Prior="#009988", Posterior="#EE7733" ))+ 
   theme_classic() +  
  theme(legend.title = element_blank(),legend.position=c(0.8,0.7),
      panel.background = element_rect(color="black",size=1),
      legend.background = element_rect(fill="transparent", color=NA))
print(p)

ggsave(here ("output-plots",paste0( sa, "PFOS_hl_gsd.pdf")), p, dpi=600)
ggsave(here ("output-plots",paste0( sa, "PFOS_hl_gsd.png")), p, dpi=600)

Distribution Volume

For PFOS, the data were not particularly informative, but slightly increased the estimate of the median to 0.308(0.223-0.548) slightly. They were not informative as to the population GSD, with the posterior distributions essentially unchanged from the priors.

PFOS_priors$Vd_GM <- rlnorm(50000,
                             meanlog=-1.46968,
                             sdlog=0.2624)
PFOS_Vd_GM <- exp(dat$`M_ln_Vd(1)`)

 

PFOS_vd_gm_pr_med <- signif(median(PFOS_priors$Vd_GM,3))
PFOS_vd_gm_pr_med_95ci <- paste(signif(quantile(PFOS_priors$Vd_GM,
                                            prob=c(0.025,0.975)), 3), collapse="-")
PFOS_vd_gm_med <- signif(median(PFOS_Vd_GM),3)
PFOS_vd_gm_med_95ci <- paste(signif(quantile(PFOS_Vd_GM,
                                            prob=c(0.025,0.975)),3),collapse="-")

p<-ggplot()+
  stat_density(aes(Vd_GM, color = "Prior"),data=PFOS_priors,geom="line",size=2)+
  stat_density(aes(PFOS_Vd_GM,stat(density), color = "Posterior"),geom="line",size=1.5)+
  xlim(0,1)+labs(title = bquote("C: PFOS"~V[d]~"Population GM"),
                 subtitle=paste("Posterior Median (95% CI): ",
                                PFOS_vd_gm_med," (", 
                                PFOS_vd_gm_med_95ci,")",sep=""))+
   xlab(bquote("Population GM"~V[d]~"(l/kg)"))+
  scale_color_manual(name=NULL,#
                       values=c(Prior="#009988", Posterior="#EE7733" )) +  theme_classic() +  
  theme(legend.title = element_blank(),legend.position=c(0.8,0.7),
      panel.background = element_rect(color="black",size=1),
      legend.background = element_rect(fill="transparent", color=NA))
print(p)

ggsave(here ("output-plots",paste0( sa, "PFOS_vd_gm.pdf")), p, dpi=600)
ggsave(here ("output-plots",paste0( sa, "PFOS_vd_gm.png")), p, dpi=600)
PFOS_priors$Vd_GSD = exp(abs(rnorm(50000,sd=0.17)))
PFOS_Vd_GSD <- exp(dat$`SD_ln_Vd(1)`)

PFOS_vd_gsd_pr_med <- signif(median(PFOS_priors$Vd_GSD,3))
PFOS_vd_gsd_pr_med_95ci <- paste(signif(quantile(PFOS_priors$Vd_GSD,
                                            prob=c(0.025,0.975)), 3), collapse="-")

PFOS_vd_gsd_med <- signif(median(PFOS_Vd_GSD),3)
PFOS_vd_gsd_med_95ci <- paste(signif(quantile(PFOS_Vd_GSD,
                                            prob=c(0.025,0.975)),3),collapse="-")

p<-ggplot()+
  stat_density(aes(Vd_GSD, color = "Prior"),data=PFOS_priors,geom="line",size=2)+
  stat_density(aes(PFOS_Vd_GSD,stat(density), color = "Posterior"),geom="line",size=1.5)+
  xlim(1,3)+
  labs(title = bquote("D: PFOS"~V[d]~"Population GSD "),
       subtitle=paste("Posterior Median (95% CI): ",
                      PFOS_vd_gsd_med," (",
                      PFOS_vd_gsd_med_95ci,
                      ")",sep=""))+
 xlab(bquote("Population GSD"~V[d]))+
  scale_color_manual(name=NULL, 
                     values=c(Prior="#009988", Posterior="#EE7733" )) + 
  theme_classic() +  
  theme(legend.title = element_blank(),legend.position=c(0.8,0.7),
      panel.background = element_rect(color="black",size=1),
      legend.background = element_rect(fill="transparent", color=NA))
print(p)

ggsave(here ("output-plots",paste0( sa, "PFOS_vd_gsd.pdf")), p, dpi=600)
ggsave(here ("output-plots",paste0( sa, "PFOS_vd_gsd.png")), p, dpi=600)

Clearance

Cl is k * Vd

PFOS_priors$CL_GM <- PFOS_priors$Vd_GM * (log(2)/PFOS_priors$halflife_GM)
PFOS_CL_GM <- exp(dat$`M_ln_Vd(1)` + dat$`M_ln_k(1)`)

PFOS_cl_gm_pr_med <- signif(median(PFOS_priors$CL_GM,3))
PFOS_cl_gm_pr_med_95ci <- paste(signif(quantile(PFOS_priors$CL_GM,
                                            prob=c(0.025,0.975)), 3), collapse="-")
PFOS_cl_gm_med <- signif(median(PFOS_CL_GM),3)
PFOS_cl_gm_med_95ci <- paste(signif(quantile(PFOS_CL_GM,
                                            prob=c(0.025,0.975)),3),collapse="-")

p<-ggplot()+
  stat_density(aes(CL_GM, color = "Prior"),data=PFOS_priors,geom="line",size=2)+
  stat_density(aes(PFOS_CL_GM,stat(density), color = "Posterior"),geom="line",size=1.5)+
  xlim(0,0.25)+labs(title = "B: PFOS Clearance Pop. GM ",subtitle=paste("Posterior Median (95% CI): ",
                                                                    PFOS_cl_gm_med," (",
                                                                    PFOS_cl_gm_med_95ci,
                                                                    ")",sep=""))+
  xlab("Pop. GM CL (l/(kg-yr))")+
  scale_color_manual(name=NULL,#
                       values=c(Prior="#009988", Posterior="#EE7733" )) +  
  theme_classic() +  
  theme(legend.title = element_blank(),legend.position=c(0.8,0.7),
      panel.background = element_rect(color="black",size=1),
      legend.background = element_rect(fill="transparent", color=NA))
print(p)

ggsave(here ("output-plots",paste0( sa, "PFOS_CL_gm.pdf")), p, dpi=600)
ggsave(here ("output-plots",paste0( sa, "PFOS_CL_gm.png")), p, dpi=600)
PFOS_priors$CL_GSD = exp(sqrt(log(PFOS_priors$Vd_GSD)^2 + 
  log(PFOS_priors$halflife_GSD)^2))
PFOS_CL_GSD <- exp(sqrt(log(PFOS_Vd_GSD)^2 + 
  log(PFOS_halflife_GSD)^2))

PFOS_CL_gsd_pr_med <- signif(median(PFOS_priors$CL_GSD,3))
PFOS_CL_gsd_pr_med_95ci <- paste(signif(quantile(PFOS_priors$CL_GSD,
                                            prob=c(0.025,0.975)), 3), collapse="-")

PFOS_CL_gsd_med <- signif(median(PFOS_CL_GSD),3)
PFOS_CL_gsd_med_95ci <- paste(signif(quantile(PFOS_CL_GSD,
                                            prob=c(0.025,0.975)),3),collapse="-")

p<-ggplot()+
  stat_density(aes(CL_GSD, color = "Prior"),data=PFOS_priors,geom="line",size=2)+
  stat_density(aes(PFOS_CL_GSD,stat(density), color = "Posterior"),geom="line",size=1.5)+
  xlim(1,3)+
  labs(title = bquote("H: PFOS"~CL~"Population GSD "),
       subtitle=paste("Posterior Median (95% CI): ",
                      PFOS_CL_gsd_med," (",
                      PFOS_CL_gsd_med_95ci,
                      ")",sep=""))+
  xlab(bquote("Population GSD"~CL))+
  scale_color_manual(name=NULL, 
                     values=c(Prior="#009988", Posterior="#EE7733" )) + 
  theme_classic() +  
  theme(legend.title = element_blank(),legend.position=c(0.8,0.7),
      panel.background = element_rect(color="black",size=1),
      legend.background = element_rect(fill="transparent", color=NA))
print(p)

ggsave(here ("output-plots",paste0( sa,"PFOS_CL_gsd.pdf")) ,p,dpi=600)
ggsave(here ("output-plots",paste0( sa,"PFOS_CL_gsd.png")) ,p,dpi=600)

Table significant digit values

PFOS_hlgm_pr_med <- paste(signif(PFOS_hlgm_pr_med, 3))
PFOS_hl_median_gm<- paste(signif(PFOS_hl_median_gm, 3))
PFOS_hlgsd_pr_med<- paste(signif(PFOS_hlgsd_pr_med, 3))
PFOS_hl_gsd_med<- paste(signif(PFOS_hl_gsd_med, 3))
PFOS_vd_gm_pr_med<- paste(signif(PFOS_vd_gm_pr_med, 3))
PFOS_vd_gm_med<- paste(signif(PFOS_vd_gm_med, 3))
PFOS_vd_gsd_pr_med<- paste(signif(PFOS_vd_gsd_pr_med, 3))
PFOS_vd_gsd_med<- paste(signif(PFOS_vd_gsd_med, 3))
PFOS_cl_gm_pr_med<- paste(signif(PFOS_cl_gm_pr_med, 3))
PFOS_cl_gm_med<- paste(signif(PFOS_cl_gm_med, 3))

Population median estimates [95% CI]

Parameter Prior GM Posterior GM Prior GSD Posterior GSD
Half-life (years) 4.62 3.42 1.56 1.57
HL [95% CI] [2.08-10.3] [2.62-4.5] [1.42-1.76] [1.43-1.75]
Volume of distribution 0.23 0.322 1.12 1.11
\(V_D\) [95% CI] [0.137-0.384] [0.221-0.47] [1.01-1.46] [1-1.41]
Clearance 0.0344 0.0656
\(CL\) [95% CI] [0.0133-0.0894] [0.0478-0.0923] [] []

Individual Posterior estimates

Parameter median GM [95% CI] GM calculator input GSD individual
Half-life (years) 3.35 [ 1.25-8.61 ] 3.36 1.63
Volume of distribution \(V_D\) 0.322 [ 0.184-0.547 ] 0.321 1.3
Clearance (L/kg-yr) 0.067 [ 0.0245-0.176 ] [[ 0.0203-0.199 ]] 0.0664 1.65
─ Session info ───────────────────────────────────────────────────────────────
 setting  value                                      
 version  R version 3.6.3 (2020-02-29)               
 os       Red Hat Enterprise Linux Server 7.9 (Maipo)
 system   x86_64, linux-gnu                          
 ui       X11                                        
 language (EN)                                       
 collate  en_US.UTF-8                                
 ctype    en_US.UTF-8                                
 tz       America/New_York                           
 date     2022-01-23                                 

─ Packages ───────────────────────────────────────────────────────────────────
 package     * version  date       lib source        
 assertthat    0.2.1    2019-03-21 [2] CRAN (R 3.6.3)
 backports     1.2.1    2020-12-09 [2] CRAN (R 3.6.3)
 bayesplot   * 1.8.0    2021-01-10 [2] CRAN (R 3.6.3)
 broom         0.7.5    2021-02-19 [2] CRAN (R 3.6.3)
 bslib         0.2.4    2021-01-25 [2] CRAN (R 3.6.3)
 cachem        1.0.4    2021-02-13 [2] CRAN (R 3.6.3)
 callr         3.5.1    2020-10-13 [2] CRAN (R 3.6.3)
 cellranger    1.1.0    2016-07-27 [2] CRAN (R 3.6.3)
 cli           2.3.1    2021-02-23 [2] CRAN (R 3.6.3)
 coda        * 0.19-4   2020-09-30 [2] CRAN (R 3.6.3)
 codetools     0.2-18   2020-11-04 [2] CRAN (R 3.6.3)
 colorspace    2.0-0    2020-11-11 [2] CRAN (R 3.6.3)
 crayon        1.4.1    2021-02-08 [2] CRAN (R 3.6.3)
 DBI           1.1.1    2021-01-15 [2] CRAN (R 3.6.3)
 dbplyr        2.1.0    2021-02-03 [2] CRAN (R 3.6.3)
 debugme       1.1.0    2017-10-22 [2] CRAN (R 3.6.3)
 desc          1.3.0    2021-03-05 [2] CRAN (R 3.6.3)
 devtools      2.3.2    2020-09-18 [2] CRAN (R 3.6.3)
 digest        0.6.27   2020-10-24 [2] CRAN (R 3.6.3)
 dplyr       * 1.0.5    2021-03-05 [2] CRAN (R 3.6.3)
 ellipsis      0.3.1    2020-05-15 [2] CRAN (R 3.6.3)
 evaluate      0.14     2019-05-28 [2] CRAN (R 3.6.3)
 fansi         0.4.2    2021-01-15 [2] CRAN (R 3.6.3)
 farver        2.1.0    2021-02-28 [2] CRAN (R 3.6.3)
 fastmap       1.1.0    2021-01-25 [2] CRAN (R 3.6.3)
 forcats     * 0.5.1    2021-01-27 [2] CRAN (R 3.6.3)
 fs            1.5.0    2020-07-31 [2] CRAN (R 3.6.3)
 generics      0.1.0    2020-10-31 [2] CRAN (R 3.6.3)
 ggplot2     * 3.3.3    2020-12-30 [2] CRAN (R 3.6.3)
 ggridges      0.5.3    2021-01-08 [2] CRAN (R 3.6.3)
 ggsci       * 2.9      2018-05-14 [2] CRAN (R 3.6.3)
 glue          1.4.2    2020-08-27 [2] CRAN (R 3.6.3)
 gtable        0.3.0    2019-03-25 [2] CRAN (R 3.6.3)
 haven         2.3.1    2020-06-01 [2] CRAN (R 3.6.3)
 here        * 1.0.1    2020-12-13 [2] CRAN (R 3.6.3)
 highr         0.8      2019-03-20 [2] CRAN (R 3.6.3)
 hms           1.0.0    2021-01-13 [2] CRAN (R 3.6.3)
 htmltools     0.5.1.1  2021-01-22 [2] CRAN (R 3.6.3)
 httr          1.4.2    2020-07-20 [2] CRAN (R 3.6.3)
 jquerylib     0.1.3    2020-12-17 [2] CRAN (R 3.6.3)
 jsonlite      1.7.2    2020-12-09 [2] CRAN (R 3.6.3)
 khroma      * 1.7.0    2021-09-02 [1] CRAN (R 3.6.3)
 knitr         1.31     2021-01-27 [2] CRAN (R 3.6.3)
 labeling      0.4.2    2020-10-20 [2] CRAN (R 3.6.3)
 lattice       0.20-41  2020-04-02 [2] CRAN (R 3.6.3)
 lifecycle     1.0.0    2021-02-15 [2] CRAN (R 3.6.3)
 lubridate     1.7.10   2021-02-26 [2] CRAN (R 3.6.3)
 magrittr      2.0.1    2020-11-17 [2] CRAN (R 3.6.3)
 memoise       2.0.0    2021-01-26 [2] CRAN (R 3.6.3)
 modelr        0.1.8    2020-05-19 [2] CRAN (R 3.6.3)
 munsell       0.5.0    2018-06-12 [2] CRAN (R 3.6.3)
 pillar        1.5.1    2021-03-05 [2] CRAN (R 3.6.3)
 pkgbuild      1.2.0    2020-12-15 [2] CRAN (R 3.6.3)
 pkgconfig     2.0.3    2019-09-22 [2] CRAN (R 3.6.3)
 pkgload       1.2.0    2021-02-23 [2] CRAN (R 3.6.3)
 plyr          1.8.6    2020-03-03 [2] CRAN (R 3.6.3)
 prettyunits   1.1.1    2020-01-24 [2] CRAN (R 3.6.3)
 pROC          1.17.0.1 2021-01-13 [2] CRAN (R 3.6.3)
 processx      3.4.5    2020-11-30 [2] CRAN (R 3.6.3)
 ps            1.6.0    2021-02-28 [2] CRAN (R 3.6.3)
 purrr       * 0.3.4    2020-04-17 [2] CRAN (R 3.6.3)
 R6            2.5.0    2020-10-28 [2] CRAN (R 3.6.3)
 Rcpp          1.0.6    2021-01-15 [2] CRAN (R 3.6.3)
 readr       * 1.4.0    2020-10-05 [2] CRAN (R 3.6.3)
 readxl        1.3.1    2019-03-13 [2] CRAN (R 3.6.3)
 remotes       2.2.0    2020-07-21 [2] CRAN (R 3.6.3)
 reprex        1.0.0    2021-01-27 [2] CRAN (R 3.6.3)
 reshape2    * 1.4.4    2020-04-09 [2] CRAN (R 3.6.3)
 rlang         0.4.10   2020-12-30 [2] CRAN (R 3.6.3)
 rmarkdown     2.7      2021-02-19 [2] CRAN (R 3.6.3)
 rprojroot     2.0.2    2020-11-15 [2] CRAN (R 3.6.3)
 rstudioapi    0.13     2020-11-12 [2] CRAN (R 3.6.3)
 rvest         1.0.0    2021-03-09 [2] CRAN (R 3.6.3)
 sass          0.3.1    2021-01-24 [2] CRAN (R 3.6.3)
 scales      * 1.1.1    2020-05-11 [2] CRAN (R 3.6.3)
 sessioninfo   1.1.1    2018-11-05 [2] CRAN (R 3.6.3)
 stringi       1.5.3    2020-09-09 [2] CRAN (R 3.6.3)
 stringr     * 1.4.0    2019-02-10 [2] CRAN (R 3.6.3)
 testthat      3.0.2    2021-02-14 [2] CRAN (R 3.6.3)
 tibble      * 3.1.0    2021-02-25 [2] CRAN (R 3.6.3)
 tidyr       * 1.1.3    2021-03-03 [2] CRAN (R 3.6.3)
 tidyselect    1.1.0    2020-05-11 [2] CRAN (R 3.6.3)
 tidyverse   * 1.3.0    2019-11-21 [2] CRAN (R 3.6.3)
 usethis       2.0.1    2021-02-10 [2] CRAN (R 3.6.3)
 utf8          1.2.1    2021-03-12 [2] CRAN (R 3.6.3)
 vctrs         0.3.6    2020-12-17 [2] CRAN (R 3.6.3)
 withr         2.4.1    2021-01-26 [2] CRAN (R 3.6.3)
 xfun          0.22     2021-03-11 [2] CRAN (R 3.6.3)
 xml2          1.3.2    2020-04-23 [2] CRAN (R 3.6.3)
 yaml          2.2.1    2020-02-01 [2] CRAN (R 3.6.3)
 yardstick   * 0.0.9    2021-11-22 [1] CRAN (R 3.6.3)

[1] /home/ad.abt.local/layc/R/x86_64-pc-linux-gnu-library/3.6
[2] /opt/R/3.6.3/lib64/R/library
LS0tCnRpdGxlOiAiUEZPUyAxIGNvbXBhcnRtZW50IFBsb3RzICh2OCkiCmF1dGhvcjogIldlaWhzdWVoIENoaXUsIENsYWlyZSBMYXksIFBhcmtlciBNYWxlayIKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUYnKWAiCmtuaXQ6IChmdW5jdGlvbihpbnB1dEZpbGUsIGVuY29kaW5nKSB7b3V0ZGlyID0gZmlsZS5wYXRoKGRpcm5hbWUoaW5wdXRGaWxlKSwgJ21hcmtkb3duJywgcGFzdGUwKGZvcm1hdChTeXMudGltZSgpLCAnJUYnKSkpOyBpZighZGlyLmV4aXN0cyhvdXRkaXIpKXtkaXIuY3JlYXRlKG91dGRpcil9OyBybWFya2Rvd246OnJlbmRlcihpbnB1dEZpbGUsIGVuY29kaW5nID0gZW5jb2RpbmcsIG91dHB1dF9mb3JtYXQgPSAnYWxsJywgb3V0cHV0X2RpciA9IG91dGRpcikgfSkKb3V0cHV0OgogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBkZl9wcmludDoga2FibGUKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDUKLS0tCgpgYGB7ciBzZXR1cH0KbGlicmFyeShjb2RhKQpsaWJyYXJ5KGJheWVzcGxvdCkgCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ3NjaSkKbGlicmFyeShraHJvbWEpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHJlc2hhcGUyKQpsaWJyYXJ5KHlhcmRzdGljaykKbGlicmFyeShoZXJlKQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGRwaSA9IDMwMCApCmBgYAoKU2V0IHVwIE1DU2ltIGZpbGUKCmBgYHtyIG1jc2ltfQojIHRoaXMgbWFya2Rvd24gZmlsZSBtdXN0IGJlIHNhdmVkIGluIHRvcCBsZXZlbCBkaXJlY3RvcnkgZm9yIHRoZSBmb2xsb3dpbmcgdG8gd29yazsgdGhlIG1jc2ltIGNvZGUgZGVwZW5kcyBvbiBnZXR3ZCByZXN1bHRzLgptZGlyIDwtICJNQ1NpbSIKc291cmNlKGhlcmU6OmhlcmUobWRpciwic2V0dXBfTUNTaW0uUiIpKQojIE1ha2UgbW9kLmV4ZSAodXNlZCB0byBjcmVhdGUgbWNzaW0gZXhlY3V0YWJsZSBmcm9tIG1vZGVsIGZpbGUpCm1ha2Vtb2QoKSAKYGBgCgojIyBTZXQgZmlsZW5hbWVzIGFuZCBsb2FkIGRhdGEKCgpgYGB7ciBNQ01DICBtb2RlbCBmaWxlLCBpbmNsdWRlPUZBTFNFfQpzZXQuc2VlZCgzMTQxNTkpCnNhIDwtICJDYmdkLTgwXyIgIyBBREQgc2Vuc2l0aXZpdHkgdGVzdCB0YWcgdG8gcGxvdCBmaWxlbmFtZXM6IE1fbG5fQ2JnZF9zYyB0byBiZSBjZW50ZXJlZCBvbiBsbigwLjgpIGluc3RlYWQgb2YgMCAoZGVjcmVhc2VkIGJ5IDIwJSkKIyBNYWtlIG1vZGVsIGV4ZWN1dGFibGUKbW9kZWxfZmlsZTwtICJQRkFTXzFjcHRfdjgucG9wLk1DTUMubW9kZWwuUiIKbWFrZW1jc2ltKG1vZGVsX2ZpbGUpCgppbl9maWxlIDwtICJQRk9TXzFjcHRfdjguUG9wTUNNQ19NZWFuSW5kaXZUcmFpblRlc3QuaW4uUiIgCnBmYXNfbmFtZSA8LSBnc3ViKCJfMWNwdF92OC5Qb3BNQ01DX01lYW5JbmRpdlRyYWluVGVzdC5pbi5SIiwgIiIsIGluX2ZpbGUpCgpzYW1wcyA8LSBkYXRhLmZyYW1lKCkKY2hlY2tzIDwtIGRhdGEuZnJhbWUoKQpzYW1wcy5saXN0IDwtIGxpc3QoKQpmb3IgKGNoYWlubnVtIGluIDE6NCkgewogIG9uZWNoYWluIDwtIHJlYWQuZGVsaW0oc3ViKCIuaW4uUiIscGFzdGUwKGNoYWlubnVtLCIub3V0IiksaW5fZmlsZSkpCiAgc2FtcHMubGlzdFtbY2hhaW5udW1dXTwtbWNtYyhvbmVjaGFpbltmbG9vcihucm93KG9uZWNoYWluKSAvIDIpOm5yb3cob25lY2hhaW4pLCAtMV0pCiAgc2FtcHMgPC0gcmJpbmQoc2FtcHMsc2FtcHMubGlzdFtbY2hhaW5udW1dXSkKICBvbmVjaGVjayA8LSByZWFkLmRlbGltKHN1YigiLmluLlIiLHBhc3RlMChjaGFpbm51bSwiLmNoZWNrLm91dCIpLGluX2ZpbGUpKQogIG9uZWNoZWNrJENoYWluIDwtIGNoYWlubnVtCiAgY2hlY2tzIDwtIHJiaW5kKGNoZWNrcyxvbmVjaGVjaykKfQpzYW1wcy5tY21jbGlzdCA8LSBhcy5tY21jLmxpc3Qoc2FtcHMubGlzdCkKCmxvYWQoIlBGT1NfMWNwdF92OF9tdWx0aWNoZWNrLlJkYXRhIikKYGBgCgojIyBTZXQgdXAgZGF0YXNldAoKYGBge3IgZGF0YXNldC1MVVQsIGNhY2hlID0gVFJVRX0KaWRfbHV0IDwtIG11bHRpY2hlY2skZGZfY2hlY2sgJT4lIHNlbGVjdChMZXZlbCkgJT4lIHVuaXF1ZSAoKSAgJT4lCiAgbXV0YXRlKGRhdGFzZXQgPSBjKCAKICAgIHJlcCgiRGVjYXR1ciBNIFRyYWluIiwgOSksCiAgICByZXAoIkRlY2F0dXIgRiBUcmFpbiIsIDkpLAogICAgcmVwKCJEZWNhdHVyIE0gVGVzdCIsIDkpLAogICAgcmVwKCJEZWNhdHVyIEYgVGVzdCIsIDEwKSwKICAgIHJlcCgiTWlubmVzb3RhIFRyYWluIiwgNDkpLAogICAgcmVwKCJNaW5uZXNvdGEgVGVzdCIsIDQ5KSwKICAgICdQYXVsc2Jvcm8tVHJhaW4nLCdIb3JzaGFtLVRyYWluJywKICAgICdXYXJtaW5zdGVyLVRlc3QnLCdXYXJyaW5ndG9uLVRyYWluJyksIAogICAgU2V4ID0gYyggCiAgICByZXAoIk0iLCA5KSwKICAgIHJlcCgiRiIsIDkpLAogICAgcmVwKCJNIiwgOSksCiAgICByZXAoIkYiLCAxMCksCiAgICByZXAoIk1peGVkIiwgNDkpLAogICAgcmVwKCJNaXhlZCIsIDQ5KSwgCiAgICByZXAoIk1peGVkIiwgNCkpLAogICAgQ2l0eSA9IGMoIAogICAgcmVwKCJEZWNhdHVyIiwgMTgpLAogICAgcmVwKCJEZWNhdHVyIiwgMTkpLAogICAgcmVwKCJNaW5uZXNvdGEiLCA5OCksCiAgICAnUGF1bHNib3JvJywnSG9yc2hhbScsJ1dhcm1pbnN0ZXInLCdXYXJyaW5ndG9uJyksIAogICAgVHJhaW5fVGVzdCA9IGMoIAogICAgcmVwKCJUcmFpbiIsIDkpLAogICAgcmVwKCJUcmFpbiIsIDkpLAogICAgcmVwKCJUZXN0IiwgOSksCiAgICByZXAoIlRlc3QiLCAxMCksCiAgICByZXAoIlRyYWluIiwgNDkpLAogICAgcmVwKCJUZXN0IiwgNDkpLAogICAgJ1RyYWluJywnVHJhaW4nLAogICAgJ1Rlc3QnLCdUZXN0JyksCiAgICAgICAgZGF0YXR5cGUgPSBjKAogICAgICByZXAoIkluZGl2aWR1YWwiLDkrOSs5KzEwKzQ5KzQ5KSwKICAgICAgcmVwKCJTdW1tYXJ5Iiw0KSksCiAgICBTaW11bGF0aW9uID0gcm93X251bWJlcigpLAogICAgdmFyaWFibGUgPSBwYXN0ZTAoZGF0YXNldCwgIiAiLFNpbXVsYXRpb24pKQoKaWRfbHV0JGRhdGFzZXQgPC0gZmFjdG9yKGlkX2x1dCRkYXRhc2V0LGxldmVscz0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiRGVjYXR1ciBNIFRyYWluIiwiRGVjYXR1ciBGIFRyYWluIiwiQXJuc2JlcmcgTSBUcmFpbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFybnNiZXJnIEYgVHJhaW4iLCJEZWNhdHVyIE0gVGVzdCIsIkRlY2F0dXIgRiBUZXN0IiwiQXJuc2JlcmcgTSBUZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJuc2JlcmcgRiBUZXN0IiwiTWlubmVzb3RhIFRyYWluIiwiTWlubmVzb3RhIFRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMdWJlY2stQmFydGVsbC1UcmFpbicsICdMdWJlY2stQmFydGVsbC1UZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTGl0dGxlIEhvY2tpbmctQmFydGVsbC1UcmFpbicsICdMaXR0bGUgSG9ja2luZy1CYXJ0ZWxsLVRlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMaXR0bGUgSG9ja2luZy1FbW1ldHQtVGVzdCcsJ1BhdWxzYm9yby1UcmFpbicsJ0hvcnNoYW0tVHJhaW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXYXJtaW5zdGVyLVRlc3QnLCdXYXJyaW5ndG9uLVRyYWluJykpCmlkX2x1dCRDaXR5IDwtIGZhY3RvcihpZF9sdXQkQ2l0eSxsZXZlbHMgPSAKICAgICAgICAgICAgICAgICAgICAgICAgYygiRGVjYXR1ciIsIkFybnNiZXJnIiwiTWlubmVzb3RhIiwnTHViZWNrLUJhcnRlbGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICdMaXR0bGUgSG9ja2luZy1CYXJ0ZWxsJywnTGl0dGxlIEhvY2tpbmctRW1tZXR0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAnUGF1bHNib3JvJywnSG9yc2hhbScsJ1dhcm1pbnN0ZXInLCdXYXJyaW5ndG9uJykpCiAKCmluZGl2X2x1dCA8LSBpZF9sdXQgJT4lIAogIGZpbHRlcihDaXR5ICVpbiUgYygiRGVjYXR1ciIsICJNaW5uZXNvdGEiKSkgJT4lCiAgbXV0YXRlKCAgZGF0YXNldCA9IGFzLmZhY3RvcihkYXRhc2V0KSkKCm52IDwtIGRhdGEuZnJhbWUoZGF0YXNldCA9dW5pcXVlKGluZGl2X2x1dCRkYXRhc2V0KSwgCiAgICAgICAgICAgdmFyaWFibGU9IHJlcCgiUG9wIEdNIiwgNiksCiAgICAgICAgICAgdHlwZT0gcmVwKCJQb3AgR00iLCA2KSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpgYGAKCiMjIEluZGl2aWR1YWwgcGFyYW1ldGVycwpgYGB7ciBpbmRpdi1wYXJtcywgY2FjaGUgPSBUUlVFLGZpZy5oZWlnaHQ9My41LGZpZy53aWR0aD0zLjUsZHBpPTYwMH0Kc2V0LnNlZWQoMzE0MTU5KQoKaW5kaXZfcGFybXMgPC0gaW5kaXZfbHV0Cmxua3Bhcm1uYW1lcyA8LSBwYXN0ZSgibG5fay4iLGdzdWIoIl8iLCIuIixpbmRpdl9wYXJtcyRMZXZlbCksIi4iLHNlcD0iIikKbG5WZHBhcm1uYW1lcyA8LSBwYXN0ZSgibG5fVmQuIixnc3ViKCJfIiwiLiIsaW5kaXZfcGFybXMkTGV2ZWwpLCIuIixzZXA9IiIpCgpwYXJtc2FtcCA8LSBhcHBseShtdWx0aWNoZWNrJHBhcm1zLnNhbXAsMixzYW1wbGUsMSkKCiMjIFJhbmRvbSB6LXNjb3JlIGVzdGltYXRlIG9mIGVhY2ggcGFyYW1ldGVyCmluZGl2X3Bhcm1zJGxuX2suei5zYW1wIDwtIHBhcm1zYW1wW2xua3Bhcm1uYW1lc10KaW5kaXZfcGFybXMkbG5fVmQuei5zYW1wIDwtIHBhcm1zYW1wW2xuVmRwYXJtbmFtZXNdCgpub3JtZCA8LSBkYXRhLmZyYW1lKHg9cW5vcm0ocHBvaW50cygyMDApKSkKbm9ybWQkeSA8LSBkbm9ybShub3JtZCR4KQoKaXBsb3RrPC0KICBnZ3Bsb3Qoc3Vic2V0KGluZGl2X3Bhcm1zLFRyYWluX1Rlc3Q9PSJUcmFpbiIpKSsKICAgIGdlb21faGlzdG9ncmFtKGFlcyh4PWxuX2suei5zYW1wLGFmdGVyX3N0YXQoZGVuc2l0eSkpLGJpbnM9MjApK2ZhY2V0X3dyYXAofkNpdHksbmNvbD0xKSsKICAgIGdlb21fbGluZShhZXMoeD14LHk9eSksZGF0YT1ub3JtZCkrCiAgICB4bGFiKCJJbmRpdmlkdWFsIHotc2NvcmVzIGZvciBrIikgKyB0aGVtZV9idygpCgppcGxvdFZkPC0KICBnZ3Bsb3Qoc3Vic2V0KGluZGl2X3Bhcm1zLFRyYWluX1Rlc3Q9PSJUcmFpbiIpKSsKICAgIGdlb21faGlzdG9ncmFtKGFlcyh4PWxuX1ZkLnouc2FtcCxhZnRlcl9zdGF0KGRlbnNpdHkpKSxiaW5zPTIwKStmYWNldF93cmFwKH5DaXR5LG5jb2w9MSkrCiAgICBnZW9tX2xpbmUoYWVzKHg9eCx5PXkpLGRhdGE9bm9ybWQpKwogICAgeGxhYigiSW5kaXZpZHVhbCB6LXNjb3JlcyBmb3IgVmQiKSArIHRoZW1lX2J3KCkKCnByaW50KGlwbG90aykKcHJpbnQoaXBsb3RWZCkKCmdnc2F2ZShmaWxlLnBhdGgoIm91dHB1dC1wbG90cyIsCiAgICAgICAgICAgICBwYXN0ZTAoIHNhLCJJbmRpdl96c2NvcmVzX2tfUEZPUy5wZGYiKSksaXBsb3RrLGRwaT02MDApCmdnc2F2ZShmaWxlLnBhdGgoIm91dHB1dC1wbG90cyIsCiAgICAgICAgICAgICBwYXN0ZTAoIHNhLCJJbmRpdl96c2NvcmVzX1ZkX1BGT1MucGRmIikpLGlwbG90VmQsZHBpPTYwMCkKCmdnc2F2ZShmaWxlLnBhdGgoIm91dHB1dC1wbG90cyIsCiAgICAgICAgICAgICBwYXN0ZTAoIHNhLCJJbmRpdl96c2NvcmVzX2tfUEZPUy5wbmciKSksaXBsb3RrLGRwaT02MDApCmdnc2F2ZShmaWxlLnBhdGgoIm91dHB1dC1wbG90cyIsCiAgICAgICAgICAgICBwYXN0ZTAoIHNhLCJJbmRpdl96c2NvcmVzX1ZkX1BGT1MucG5nIikpLGlwbG90VmQsZHBpPTYwMCkKYGBgCiMjIFNjYXR0ZXIgcGxvdCBvZiBwcmVkaWN0aW9ucyAobWVkaWFuIG9mIG11bHRpY2hlY2sgc2FtcGxlcykgdmVyc3VzIGRhdGEuCgpUaGlzIGlzIGEgRmlndXJlIDIgcGFuZWwuICBOZWVkZWQgdG8gdXNlICJzY2FsZT0xLjEiIGluIGdnc2F2ZSB0byBtYXRjaCBQRk9BLgoKYGBge3IgcHJlZGljdGlvbi12ZXJzdXMtZGF0YSAsIGNhY2hlID0gVFJVRSxmaWcuaGVpZ2h0PTMuNSxmaWcud2lkdGg9OCxkcGk9NjAwfQpucm93KG11bHRpY2hlY2skZGZfY2hlY2spCm5yb3coaWRfbHV0KQptdWx0aWNoZWNrJGRmX2NoZWNrICU+JSBsZWZ0X2pvaW4oaWRfbHV0KSAlPiUgbnJvdygpCgpuYW1lcyhtdWx0aWNoZWNrJGRmX2NoZWNrKQoKbXVsdGljaGVjazIgPC0gbXVsdGljaGVjayRkZl9jaGVjayAlPiUgbGVmdF9qb2luKGlkX2x1dCklPiUgCiAgZ3JvdXBfYnlfYXQgKCB2YXJzKC1QcmVkaWN0aW9uKSkgJT4lIAogIHN1bW1hcmlzZShQcmVkaWN0aW9uID0gbWVkaWFuKFByZWRpY3Rpb24pKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkoQ2l0eSkgJT4lIAogIG11dGF0ZShUcmFpbl9UZXN0ID0gZmFjdG9yKFRyYWluX1Rlc3QsIGxldmVscyA9IGMoIlRyYWluIiwgIlRlc3QiKSksCiAgICAgICAgIGBDaXR5IChkYXRhdHlwZSlgID0gZmFjdG9yIChwYXN0ZTAoIlxuIiwgQ2l0eSwgIlxuKCIsIGRhdGF0eXBlLCAiKVxuIikgKSwKICAgICAgICAgbGFiZWwgPSBjYXNlX3doZW4oVHJhaW5fVGVzdD09IlRyYWluIiB+ICJDOiBQRk9TIFRyYWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaW5fVGVzdD09IlRlc3QiICB+IkQ6IFBGT1MgVGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiIikpCiAjZGVmaW5lIGNvbG9yIGZvciB0ZXN0aW5nIGJveHBsb3RzCmJwX2NvbHMgPC0gYyAoYXMuY2hhcmFjdGVyIChraHJvbWE6OmNvbG91cigibXV0ZWQiKSg5KSkgLCAiIzE5MTkxOSIpICAgCmJwX2NvbHMgPC1icF9jb2xzW2MoMSwzLCA3LCAxMDo4KV0jIHBsb3Rfc2NoZW1lX2NvbG91cmJsaW5kKGJwX2NvbHMpIAoKIyMjIENyZWF0ZSBhZXN0aGV0aWNzIGxvb2t1cAphZXNfbHV0IDwtIG11bHRpY2hlY2syICU+JSB1bmdyb3VwKCkgJT4lIAogIGdyb3VwX2J5KENpdHksIGRhdGF0eXBlLCAgYENpdHkgKGRhdGF0eXBlKWAgKSAlPiUgc3VtbWFyaXNlICgpICU+JSB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKCBjb2xzID0gYnBfY29scywgY2l0eV9maWxscyA9ICAgYnBfY29scyAsIAogICAgICAgICAgIyBmb3IgaW5kaXZpZHVhbCBsZXZlbCBvbiBwb2ludCBwbG90IChtdWx0aWNoZWNrMiksIGRhcmtlbiBvdXRsaW5lcyBmb3IgdmlzaWJpbGl0eSwgdXNlIHN0YW5kYXJkIGNvbG9ycyBvdGhlcndpc2UKICAgICAgICAgY2l0eV9vdXRsaW5lcyA9ICBpZl9lbHNlKGRhdGF0eXBlID09ICJJbmRpdmlkdWFsIiAgLCAgY29sb3JzcGFjZTo6ZGFya2VuKGNpdHlfZmlsbHMsIDAuMyksIGNpdHlfZmlsbHMpICwgIAogICAgICAgICBzaGFwZXMgPSBjYXNlX3doZW4oZGF0YXR5cGUgPT0gIkluZGl2aWR1YWwiICAmIGBDaXR5YCAlaW4lIGMoJ0RlY2F0dXInLCAnQXJuc2JlcmcnLCAnTWlubmVzb3RhJykgICB+ICAyMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGF0eXBlID09ICJTdW1tYXJ5IiAmYENpdHlgICVpbiUgYygiSG9yc2hhbSIsICJXYXJtaW5zdGVyIiwgICJXYXJyaW5ndG9uIikgfiAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXR5cGUgPT0gIlN1bW1hcnkiICYgYENpdHlgID09ICJQYXVsc2Jvcm8iIH4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwgCiAgICAgICAgIHNpemUgPSBpZl9lbHNlKGRhdGF0eXBlID09IkluZGl2aWR1YWwiLCAxLjc1LCAyLjUgKSApICAKCnNvdXJjZSggcGFzdGUwKGdzdWIoYmFzZW5hbWUoaGVyZSgpKSwgJ3NoYXJlZF9mdW5jdGlvbnMnLCBoZXJlKCkpLCAnL3Bsb3Rfc2NhdHRlcl9tY2hlY2sucicpKQoKcDIgPC0gcGxvdF9zY2F0dGVyX21jaGVjayhkZnJhbWUgPSBtdWx0aWNoZWNrMiwgIHBmYXNfbm9tID0gcGZhc19uYW1lLCBhZXNfbHV0X2ZuID0gYWVzX2x1dCApCnByaW50KHAyKSAKZ2dzYXZlKGhlcmUgKCJvdXRwdXQtcGxvdHMiLCBwYXN0ZTAoIHNhLCJtdWx0aWNoZWNrcGxvdF8iLCBwZmFzX25hbWUsCiAgICAgICAgICAgICAgICIucGRmIikpLHAyLGRwaT02MDAsIHNjYWxlPTEuMSkKZ2dzYXZlKGhlcmUgKCJvdXRwdXQtcGxvdHMiLCBwYXN0ZTAoIHNhLCJtdWx0aWNoZWNrcGxvdF8iLCBwZmFzX25hbWUsCiAgICAgICAgICAgICAgICIucG5nIikpLHAyLGRwaT02MDAsIHNjYWxlPTEuMSkKCmBgYAoKIyMgUGFyc2UgbXVsdGljaGVjawoKYGBge3IgZG8tbXVsdGljaGVjaywgY2FjaGUgPSBUUlVFLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0xOH0KCmRmX2NoZWNrIDwtIG11bHRpY2hlY2skZGZfY2hlY2sKZGZfY2hlY2sgPC0gc3Vic2V0KGRmX2NoZWNrLERhdGEgPiAwKSAKCm4xIDwtIG5yb3coZGZfY2hlY2spCmlkX2Noa3MgPC0gZGZfY2hlY2sgJT4lIHNlbGVjdChMZXZlbCkgJT4lIHVuaXF1ZSgpICU+JSBiaW5kX2NvbHMoaWRfbHV0KSAgJT4lCiBtdXRhdGUoZGF0YXNldCA9IGFzLmZhY3RvcihkYXRhc2V0KSwgU2V4ID0gYXMuZmFjdG9yKFNleCksIENpdHkgPSBhcy5mYWN0b3IoQ2l0eSksIAogICAgICAgICBUcmFpbl9UZXN0ID0gYXMuZmFjdG9yKFRyYWluX1Rlc3QpKQoKZGZfY2hlY2sgPC0gZGZfY2hlY2sgJT4lIGxlZnRfam9pbihpZF9jaGtzKSU+JQogIG11dGF0ZShEYXRhc2V0ID0gcGFzdGUoYXMuY2hhcmFjdGVyKGRhdGFzZXQpLCBTaW11bGF0aW9uKSwKICAgICAgICAgU2V4ID0gb3JkZXJlZChTZXgsIGxldmVscyA9IGMoIk0iLCAiRiIsICJNaXhlZCIpLCAKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJGZW1hbGUiLCAiTWFsZSIsICJNaXhlZCAoYWxsIHNleGVzKSIpKSkKbjIgPC0gbnJvdyhkZl9jaGVjaykKaWYobjEgIT0gbjIpcHJpbnQoImR1cGxpY2F0ZXMgY3JlYXRlZCBpbiBpZC1sdXQgam9pbiIpCmBgYAoKCmBgYHtyIGRvLW11bHRpY2hlY2stMiwgY2FjaGUgPSBUUlVFLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0xOH0KZGZfY2hlY2skVGltZS5kZXNjIDwtIGFzLmNoYXJhY3RlcihwYXN0ZTAoIlQ9IixkZl9jaGVjayRUaW1lKSkKZGZfY2hlY2skVGltZS5kZXNjW2RmX2NoZWNrJFRpbWUuZGVzYyA9PSAiVD0xZS0wNiJdIDwtICJTdGVhZHlTdGF0ZSIKZGZfY2hlY2skRGF0YXNldC5UaW1lIDwtIGludGVyYWN0aW9uKGRmX2NoZWNrJERhdGFzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZl9jaGVjayRUaW1lLmRlc2MsbGV4Lm9yZGVyPVRSVUUpCmRmX2NoZWNrJERhdGFzZXQuVGltZSA8LSBmYWN0b3IoZGZfY2hlY2skRGF0YXNldC5UaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1sZXZlbHMoZGZfY2hlY2skRGF0YXNldC5UaW1lKSkKY2FsaWJkYXRhIDwtIGRmX2NoZWNrWyxuYW1lcyhkZl9jaGVjaykgIT0gIlByZWRpY3Rpb24iXQpjYWxpYmRhdGEgPC0gY2FsaWJkYXRhWyFkdXBsaWNhdGVkKGNhbGliZGF0YSksXQpwcmludChjYWxpYmRhdGEpCiAKI011bHRpY2hlY2sgcGxvdAoKIyBTcGxpdCBTdGVhZHkgU3RhdGUgR3JvdXAgaW50byBkaWZmZXJlbnQgcG9wdWxhdGlvbnMgZm9yIGJveHBsb3QgZ3JvdXBpbmcKI2RmX2NoZWNrW2RmX2NoZWNrJFRpbWUuZGVzYyA9PSAiU3RlYWR5U3RhdGUiICYgZ3JlcGwoIkx1YmVjayIsZGZfY2hlY2skRGF0YXNldCksXSRUaW1lLmRlc2MgPC0gIkx1YmVjayIKI2RmX2NoZWNrW2RmX2NoZWNrJFRpbWUuZGVzYyA9PSAiU3RlYWR5U3RhdGUiICYgZ3JlcGwoIkxpdHRsZSBIb2NraW5nIixkZl9jaGVjayREYXRhc2V0KSxdJFRpbWUuZGVzYyA8LSAiTGl0dGxlIEhvY2tpbmciCmBgYAoKTW9kaWZ5IGFlc3RoZXRpY3MgbG9va3VwIHRhYmxlIGZvciBib3hwbG90cyAKYGBge3IgbW9kLWFlcy1sdXR9CiMjICBhZGRpdGlvbmFsIHNvdXJjZSBhZXN0aGV0aWMgbG9va3VwIHRhYmxlIGZvciBncmV5LXNjYWxlIHRpbWUgKHllYXJzKTsgIG1lcmdlZCBsZWdlbmRzIHNhdmUgc3BhY2Ugb24gcGxvdHRpbmcgb3V0cHV0CnRpbWVzIDwtIGRmX2NoZWNrJT4lIHNlbGVjdChUaW1lLmRlc2MsIFRpbWUpICU+JSAgdW5pcXVlICgpICU+JSAKICBtdXRhdGUocmFuayA9IHJhbmsoVGltZSkgLCBncmV5ID0gZ3JleS5jb2xvcnMoc3RhcnQ9MSxlbmQ9MC40LCBuID0gbigpKSwKICAgICAgICAgYWxwaGEgPSAocmFuaykvOCkgJT4lIAogIHNlbGVjdCgtVGltZSkKIApkZl9jaGVjayA8LSBkZl9jaGVjayAlPiUgbXV0YXRlIChsZWdlbmRfbGFiZWwgPSAocGFzdGUwKENpdHksICJcbiIsIFRpbWUuZGVzYyApICkpICMgYWRkIGxlZ2VuZC1sYWJlbHMKYWVzX2x1dCA8LSBkZl9jaGVjayAlPiUgCiAgc2VsZWN0KENpdHksIFRyYWluX1Rlc3QsIGRhdGF0eXBlLFRpbWUsIFRpbWUuZGVzYywgbGVnZW5kX2xhYmVsKSAlPiUgdW5pcXVlICgpICU+JQogICBsZWZ0X2pvaW4oYWVzX2x1dFssIGMoIkNpdHkiLCAiY29scyIpXSwgYnkgPSAiQ2l0eSIpICU+JSB1bmdyb3VwICgpICU+JSB1bmlxdWUgKCklPiUKICAgbGVmdF9qb2luICh0aW1lcywgYnkgPSAiVGltZS5kZXNjIikgJT4lIAogICBhcnJhbmdlKGRhdGF0eXBlLCBDaXR5LCBUcmFpbl9UZXN0LCBUaW1lKSAgICAlPiUgCiAgIG11dGF0ZShhbHBoYSA9IGlmX2Vsc2UoQ2l0eSA9PSAiSG9yc2hhbSIsIGFscGhhLzIsIGFscGhhKSkgJT4lICMgb3RoZXJ3aXNlIHRvbyBkYXJrIHdpdGggdGhpcyBjb2xvcgogIG11dGF0ZV9pZihpcy5mYWN0b3IsIGFzLmNoYXJhY3RlcikgCgpgYGAKCgojIyBEZWNhdHVyIGJveHBsb3RzCgpDaGFuZ2VkIGdyZXkgc3RhcnQgdG8gMSBpbnN0ZWFkIG9mIDAuOCwgZW5kIGF0IDAuNiBpbnN0ZWFkIG9mIDAuNC4KQ2hhbmdlZCBzaGFwZSBvZiBzeW1ib2xzIHNvIHRoZXkgYXJlIGZpbGxlZC4KCmBgYHtyIGRvLW11bHRpY2hlY2stZGVjYXR1ciwgY2FjaGUgPSBUUlVFLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTMuNSxkcGk9NjAwfQogI0NECiAjIERlY2F0dXIgCmRmX2RlY2F0ICA8LSBkZl9jaGVjayAlPiUgICAKICBmaWx0ZXIoQ2l0eSA9PSAiRGVjYXR1ciIgJiBUcmFpbl9UZXN0ICVpbiUgYyAoIlRyYWluIiwgIlRlc3QiKSkgJT4lIAogIG11dGF0ZShwYW5lbCA9IG9yZGVyZWQgKFRyYWluX1Rlc3QsIGxldmVscyA9IGMgKCJUcmFpbiIsICJUZXN0IiksIAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkM6IFBGT1MgRGVjYXR1ciBUcmFpbiIsICJEOiBQRk9TIERlY2F0dXIgVGVzdCIpICkpCgphZXNfbHV0X2RmX2RmX2RlY2F0IDwtIGFlc19sdXQgJT4lIAogIGZpbHRlcihDaXR5ID09ICJEZWNhdHVyIiAmIFRyYWluX1Rlc3QgJWluJSBjICgiVHJhaW4iLCAiVGVzdCIpKSAlPiUgCiAgbXV0YXRlX2lmKGlzLmZhY3RvciwgYXMuY2hhcmFjdGVyKSAKCnNvdXJjZSggcGFzdGUwKGdzdWIoYmFzZW5hbWUoaGVyZSgpKSwgJ3NoYXJlZF9mdW5jdGlvbnMnLCBoZXJlKCkpLCAnL3Bsb3Rfc3VtX2JveHBsb3QucicpKQoKcGx0X3RyYWluIDwtIHBsb3Rfc3VtX2JveHBsb3QgICAoZGZyYW1lID0gZGZfZGVjYXQsIGFlc19sdXQ9IGFlc19sdXRfZGZfZGZfZGVjYXQsIGZhY2V0cyA9IFRSVUUgLCBwZmFzX25vbSA9IHBmYXNfbmFtZSAgICAgKSAKcHJpbnQocGx0X3RyYWluKQpnZ3NhdmUoaGVyZSAoIm91dHB1dC1wbG90cyIscGFzdGUwKCBzYSwiRGVjYXR1clRyYWluVGVzdGJveHBsb3QiLHBmYXNfbmFtZSwiLnBkZiIpKSxwbHRfdHJhaW4sZHBpPTYwMCkKZ2dzYXZlKGhlcmUgKCJvdXRwdXQtcGxvdHMiLHBhc3RlMCggc2EsIkRlY2F0dXJUcmFpblRlc3Rib3hwbG90IixwZmFzX25hbWUsIi5wbmciKSkscGx0X3RyYWluLGRwaT02MDApCgpgYGAKCiMjIEFsbCBib3hwbG90cwoKQ2hhbmdlZCBncmV5IHN0YXJ0IHRvIDEgaW5zdGVhZCBvZiAwLjgsIGVuZCBhdCAwLjYgaW5zdGVhZCBvZiAwLjQuCkFkZGVkIHNoYXBlcyBhbmQgZmlsbHMgdG8gZGF0YSBwb2ludHMuCgpgYGB7ciBkby1tdWx0aWNoZWNrLWFsbCwgY2FjaGUgPSBUUlVFLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTMuNSxkcGk9NjAwfQpsZXRzIDwtIExFVFRFUlM7Cm5hbWVzKGxldHMpWzE6KGxlbmd0aCh1bmlxdWUoZGZfY2hlY2skZGF0YXNldCkpLTQpXTwtYXMuY2hhcmFjdGVyKHVuaXF1ZShkZl9jaGVjayRkYXRhc2V0KSlbNTpsZW5ndGgodW5pcXVlKGRmX2NoZWNrJGRhdGFzZXQpKV0KCmZvciAoZCBpbiB1bmlxdWUoZGZfY2hlY2skZGF0YXNldCkpIHsgIyBkID0gdW5pcXVlKGRmX2NoZWNrJGRhdGFzZXQpWzExXQogICAgZGRzZXQgPC0gZGZfY2hlY2sgJT4lICAgIAogICAgZmlsdGVyKGRhdGFzZXQgPT0gZCkgCiAgICAKICAgIGFlc19sdXRfZGRzZXQgPC0gZGRzZXQgJT4lIHNlbGVjdChsZWdlbmRfbGFiZWwsICBDaXR5LFRyYWluX1Rlc3QsZGF0YXR5cGUsIFRpbWUuZGVzYyAgKSAlPiUgdW5pcXVlICgpICU+JSBpbm5lcl9qb2luKGFlc19sdXQpCiAgICAgIAogICAgZ3QgPC0gaWZlbHNlKGlzLm5hKGxldHNbZF0pLGQscGFzdGUwKGxldHNbZF0sIjogIiwgZCkpCiAgICBwbHQgPC0gcGxvdF9zdW1fYm94cGxvdChkZnJhbWUgPSBkZHNldCwgYWVzX2x1dD0gYWVzX2x1dF9kZHNldCwgZ3RpdGxlPSBndCwgZmFjZXRzID0gRkFMU0UsIHBmYXNfbm9tID0gcGZhc19uYW1lKQogICAgIAogIHByaW50KHBsdCkKICBnZ3NhdmUoaGVyZSAoIm91dHB1dC1wbG90cyIsCiAgICAgICAgICAgICAgICBwYXN0ZTAoIHNhLCBkLCItYm94cGxvdC0iLCAKICAgICAgICAgICAgICAgIHBmYXNfbmFtZSwiLnBkZiIpKSAsCiAgICAgICAgIHBsdCxkcGk9NjAwKQogIAogICAgZ2dzYXZlKGhlcmUgKCJvdXRwdXQtcGxvdHMiLAogICAgICAgICAgICAgICAgcGFzdGUwKCBzYSwgZCwiLWJveHBsb3QtIiwgCiAgICAgICAgICAgICAgICBwZmFzX25hbWUsIi5wbmciKSkgLAogICAgICAgICBwbHQsZHBpPTYwMCkKCn0KCiMjIyBtYWtlIFRyYWluaW5nIHBsb3QgIAoKZGZfZF90cnQgPC0gZGZfY2hlY2sgJT4lICAgCiAgICAgZmlsdGVyKCAoVHJhaW5fVGVzdCA9PSAiVHJhaW4iKSAmICgoT3V0cHV0X1ZhciA9PSAiTV9DYmdkX0NzcyIpIHwgKE91dHB1dF9WYXIgPT0gIk1fQ3NlcnVtIikpKSAlPiUKICAgICBtdXRhdGVfaWYoaXMuZmFjdG9yLCBhcy5jaGFyYWN0ZXIpICU+JSAgIyBkcm9wIGZhY3RvciBsZXZlbHMgdW51c2VkCiAgICAgbXV0YXRlKERhdGFzZXQuVGltZSA9IGZhY3RvcihEYXRhc2V0LlRpbWUpKSAKIAoKIGFlc19sdXRfZGZfZF90cnQgPC0gIGRmX2RfdHJ0ICU+JSBzZWxlY3QoQ2l0eSwgZGF0YXR5cGUsVGltZSwgVGltZS5kZXNjLCBsZWdlbmRfbGFiZWwpICU+JSAKICAgaW5uZXJfam9pbihhZXNfbHV0ICApICU+JSAKICAgc2VsZWN0KC1UcmFpbl9UZXN0KSAlPiUgdW5ncm91cCAoKSAlPiUgdW5pcXVlICgpICAKCnBsdF90cmFpbiA8LSAgICBwbG90X3N1bV9ib3hwbG90KGRmcmFtZSA9IGRmX2RfdHJ0LCBhZXNfbHV0PSBhZXNfbHV0X2RmX2RfdHJ0LCAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGl0bGU9IkM6IFN1bW1hcnkgRGF0YSAtIFRyYWluIiAsIGZhY2V0cyA9IEZBTFNFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZhc19ub20gPSBwZmFzX25hbWUgKQogIHByaW50KHBsdF90cmFpbikKICBnZ3NhdmUoaGVyZSAoIm91dHB1dC1wbG90cyIsIHBhc3RlMCggc2EsICJTdW1tYXJ5VHJhaW5EYXRhYm94cGxvdCIscGZhc19uYW1lLCIucGRmIikpLCBwbHRfdHJhaW4sZHBpPTYwMCkKICAgZ2dzYXZlKGhlcmUgKCJvdXRwdXQtcGxvdHMiLCBwYXN0ZTAoIHNhLCAiU3VtbWFyeVRyYWluRGF0YWJveHBsb3QiLHBmYXNfbmFtZSwiLnBuZyIpKSwgcGx0X3RyYWluLGRwaT02MDApCgojIyMgIG1ha2UgVGVzdCBwbG90CmRmX2RfdGVzdCA8LSBkZl9jaGVjayAlPiUgICAKICAgIGZpbHRlcigoVHJhaW5fVGVzdCA9PSAiVGVzdCIpICYgCiAgICAgICAgICAgICAoKE91dHB1dF9WYXIgPT0gIk1fQ2JnZF9Dc3MiKSB8IChPdXRwdXRfVmFyID09ICJNX0NzZXJ1bSIpKSkgICU+JQogICAgIG11dGF0ZV9pZihpcy5mYWN0b3IsIGFzLmNoYXJhY3RlcikgJT4lICAjIGRyb3AgZmFjdG9yIGxldmVscyB1bnVzZWQKICAgICBtdXRhdGUoRGF0YXNldC5UaW1lID0gZmFjdG9yKERhdGFzZXQuVGltZSkpIAoKYWVzX2x1dF9kZl9kX3Rlc3QgPC0gIGRmX2RfdGVzdCAlPiUgc2VsZWN0KENpdHksIGRhdGF0eXBlLFRpbWUsIFRpbWUuZGVzYywgbGVnZW5kX2xhYmVsKSAlPiUgCiAgIGlubmVyX2pvaW4oYWVzX2x1dCAgKSAlPiUgCiAgIHNlbGVjdCgtVHJhaW5fVGVzdCkgJT4lIHVuZ3JvdXAgKCkgJT4lIHVuaXF1ZSAoKSAgCgpwbHRfdGVzdCA8LSBwbG90X3N1bV9ib3hwbG90KGRmcmFtZSA9IGRmX2RfdGVzdCwgYWVzX2x1dD0gYWVzX2x1dF9kZl9kX3Rlc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aXRsZT0iRDogU3VtbWFyeSBEYXRhIC0gVGVzdCIsIGZhY2V0cyA9IEZBTFNFICwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZhc19ub20gPSBwZmFzX25hbWUpCiAgcHJpbnQocGx0X3Rlc3QpCiAgZ2dzYXZlKGhlcmUgKCJvdXRwdXQtcGxvdHMiLHBhc3RlMCggc2EsICJTdW1tYXJ5VGVzdERhdGFib3hwbG90IixwZmFzX25hbWUsIi5wZGYiKSksIHBsdF90ZXN0LGRwaT02MDApCiAgZ2dzYXZlKGhlcmUgKCJvdXRwdXQtcGxvdHMiLHBhc3RlMCggc2EsICJTdW1tYXJ5VGVzdERhdGFib3hwbG90IixwZmFzX25hbWUsIi5wbmciKSksIHBsdF90ZXN0LGRwaT02MDApCmBgYAoKIyMgUEZPUwojIyMgQmFja2dyb3VuZCBwb3N0ZXJpb3JzCgpTaG93cyBzaGlmdCBpbiBiYWNrZ3JvdW5kIGVzdGltYXRlLgoKYGBge3IgZ2V0IGJhY2tncm91bmQsIGNhY2hlID0gVFJVRSxmaWcuaGVpZ2h0PTYsZmlnLndpZHRoPTUsZHBpPTYwMH0KCmdtc2NhbGU8LTAuOAoKZGF0IDwtIG11bHRpY2hlY2skcGFybXMuc2FtcFssZ3JlcCgiTV9sbl9DYmdkIixuYW1lcyhtdWx0aWNoZWNrJHBhcm1zLnNhbXApKV0KZGF0YXNldG5hbWVzIDwtIGFzLmNoYXJhY3Rlcih1bmlxdWUoY2FsaWJkYXRhJGRhdGFzZXQpKQpkYXRhc2V0bmFtZXMgPC0gZ3N1YigiIE0iLCIiLGRhdGFzZXRuYW1lcykKZGF0YXNldG5hbWVzIDwtIGdzdWIoIiBGIiwiIixkYXRhc2V0bmFtZXMpCmRhdGFzZXRuYW1lczwtZGF0YXNldG5hbWVzWyFkdXBsaWNhdGVkKGRhdGFzZXRuYW1lcyldCm5hbWVzKGRhdCkgPC0gZGF0YXNldG5hbWVzCmRhdCA8LSBkYXRbLGdyZXAoIlRyYWluIixuYW1lcyhkYXQpKV0KZGF0LmRmIDwtIHBpdm90X2xvbmdlcihkYXQsMTpuY29sKGRhdCkpCmRhdC5kZiA8LSByYmluZChkYXQuZGYsCiAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKG5hbWU9IlByaW9yIix2YWx1ZT1ybm9ybSg1MDAwLG09bG9nKGdtc2NhbGUpLHNkPTAuNDA1NSkpKQpkYXQuZGYkbmFtZSA8LSBmYWN0b3IoZGF0LmRmJG5hbWUsbGV2ZWxzPXJldigKICAgICAgICAgICAgICAgICAgICAgICAgYygiUHJpb3IiLGRhdGFzZXRuYW1lc1tncmVwKCJUcmFpbiIsZGF0YXNldG5hbWVzKV0pKSkKZGF0LmRmJHZhbHVlIDwtIGV4cChkYXQuZGYkdmFsdWUpCgpwPC1nZ3Bsb3QoZGF0LmRmKSsKICAjZ2VvbV92aW9saW4oYWVzKHg9bmFtZSx5PXZhbHVlLGZpbGw9bmFtZT09IlByaW9yIikpKwogIGdlb21fYm94cGxvdChhZXMoeD1uYW1lLHk9dmFsdWUsZmlsbD1uYW1lPT0iUHJpb3IiKSxvdXRsaWVyLnNoYXBlPU5BKSsKICBzY2FsZV95X2xvZzEwKCkrY29vcmRfZmxpcCgpKwogICAgc2NhbGVfZmlsbF9tYW51YWwobmFtZT1OVUxMLCAKICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9YygiIzAwOTk4OCIsICIjRUU3NzMzIiApKSArCiAgdGhlbWVfY2xhc3NpYygpICsgIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGdtc2NhbGUsY29sb3I9ImdyZXkiKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yPSJibGFjayIsc2l6ZT0xKSkrCiAgeWxhYigiUG9zdGVyaW9yIHNoaWZ0IGluIEJhY2tncm91bmQgQ29uY2VudHJhdGlvbiIpCgpwcmludChwKQpnZ3NhdmUoaGVyZSAoIm91dHB1dC1wbG90cyIscGFzdGUwKCBzYSwiUEZPU19HTV9DYmdkLnBkZiIpKSAgLCBwLCBkcGk9NjAwKQpnZ3NhdmUoaGVyZSAoIm91dHB1dC1wbG90cyIscGFzdGUwKCBzYSwiUEZPU19HTV9DYmdkLnBuZyIpKSAgLCBwLCBkcGk9NjAwKQpgYGAKCiMjIyBIYWxmLWxpZmUKCkZvciBQRk9TLCB0aGUgcG9wdWxhdGlvbiBHTSBvZiB0aGUgaGFsZi1saWZlIGhhcyBhIHBvc3RlcmlvciBkaXN0cmlidXRpb24gdGhhdCBpcyBuYXJyb3dlciB0aGFuIHRoZSBwcmlvciwgd2l0aCBhIHBvc3RlcmlvciBtZWRpYW4gKDk1JSBDSSkgZXN0aW1hdGUgb2YgMy4wNiAoMi4xNi00LjM3KSB5ZWFycy4gVGhlIHBvcHVsYXRpb24gR1NEIHBvc3RlcmlvciBpcyBsYXJnZXIgdGhhbiB0aGUgcHJpb3IgYXQgMS40NygxLjQ0LTEuNzUpLgoKYGBge3IgcG9zdGVyaW9yIGhpc3RvZ3JhbXMsIGNhY2hlID0gVFJVRX0KCgpkYXQgPC0gbXVsdGljaGVjayRwYXJtcy5zYW1wWyxjKCJNX2xuX2suMS4iLCJWX2xuX2suMS4iLCAiTV9sbl9WZC4xLiIsICJTRF9sbl9WZC4xLiIpXQpuYW1lcyhkYXQpIDwtIGMoIk1fbG5faygxKSIsIlZfbG5faygxKSIsICJNX2xuX1ZkKDEpIiwgIlNEX2xuX1ZkKDEpIikKICAKc2V0LnNlZWQoMy4xNDE1OSkKZGF0JHpfbG5fayA8LSBybm9ybShucm93KGRhdCkpCmRhdCR6X2xuX1ZkIDwtIHJub3JtKG5yb3coZGF0KSkKZGF0ICU+JSByZW5hbWVfKCkKZGF0JGxuX2tfaSA8LSBkYXQkYE1fbG5faygxKWAgKyBzcXJ0KGRhdCRgVl9sbl9rKDEpYCkqZGF0JHpfbG5fawpkYXQkbG5fVmRfaSA8LSBkYXQkYE1fbG5fVmQoMSlgKyBkYXQkYFNEX2xuX1ZkKDEpYCpkYXQkel9sbl9WZApsaW5tb2QgPC0gbG0obG5fVmRfaSB+IGxuX2tfaSxkYXRhPWRhdCkKZ2dwbG90KGRhdCkgKyBnZW9tX3BvaW50KGFlcyhsbl9rX2ksbG5fVmRfaSkpICsgCiAgbGFicyhzdWJ0aXRsZT1wYXN0ZSgiQWRqIFIyID0iLHNpZ25pZihzdW1tYXJ5KGxpbm1vZCkkYWRqLnIuc3F1YXJlZCwyKSkpCmBgYAoKCiMjIENoZWNrIG5vcm1hbGl0eQoKYGBge3Igbm9ybWFsaXR5LCBjYWNoZSA9IFRSVUV9CgpxcW5vcm0oZGF0JGxuX2tfaSxtYWluPSJsbiBrIFEtUSBOb3JtYWwiKQpxcWxpbmUoZGF0JGxuX2tfaSxjb2w9InJlZCIpCnBsb3QoZWNkZihkYXQkbG5fa19pKSkKeCA8LSBzZXEoLTMsMSwwLjAxKQptX2xuX2tfaSA8LSAgIG1lYW4oZGF0JGxuX2tfaSkKc2RfbG5fa19pIDwtIHNkKGRhdCRsbl9rX2kpCmxpbmVzKHgscG5vcm0oeCxtZWFuPW1fbG5fa19pLHNkPXNkX2xuX2tfaSksY29sPSJyZWQiKQp0ZXh0KG1fbG5fa19pLTIqc2RfbG5fa19pLDAuOSxwYXN0ZSgibSA9IixzaWduaWYobV9sbl9rX2ksNCksIlxuc2QgPSIsc2lnbmlmKHNkX2xuX2tfaSw0KSkpCgpxcW5vcm0oZGF0JGxuX1ZkX2ksbWFpbj0ibG4gVmQgUS1RIE5vcm1hbCIpCnFxbGluZShkYXQkbG5fVmRfaSxjb2w9InJlZCIpCnBsb3QoZWNkZihkYXQkbG5fVmRfaSkpCnggPC0gc2VxKC0zLDEsMC4wMSkKbV9sbl9WZF9pIDwtIG1lYW4oZGF0JGxuX1ZkX2kpCnNkX2xuX1ZkX2kgPC0gc2QoZGF0JGxuX1ZkX2kpCgpsaW5lcyh4LHBub3JtKHgsbWVhbj1tX2xuX1ZkX2ksc2Q9c2RfbG5fVmRfaSksY29sPSJyZWQiKQp0ZXh0KG1fbG5fVmRfaS0yKnNkX2xuX1ZkX2ksMC45LHBhc3RlKCJtID0iLHNpZ25pZihtX2xuX1ZkX2ksNCksIlxuc2QgPSIsc2lnbmlmKHNkX2xuX1ZkX2ksNCkpKQoKYGBgCgojIyBDYWxjdWxhdGUgdGFibGUgdmFsdWVzIGZvciBpbmRpdmlkdWFsLWxldmVsCmBgYHtyIG1ha2UtaW5kaXZpZHVhbC1wYXJhbS1vdXQsIGNhY2hlID0gVFJVRX0KaGxfaSA8LSBsb2coMikvIGV4cChkYXQkbG5fa19pKSAjIGluZGl2aWR1YWwgaGFsZi1saWZlIAptZWRfaGxfaSA8LSBwYXN0ZShzaWduaWYgKG1lZGlhbiAoaGxfaSksIDMpKSAjIG1lZGlhbiBvZiBpbmRpdmlkdWFsIGhhbGYtbGlmZQpjaV9tZWRfaGxfaSA8LSAgIHBhc3RlKHNpZ25pZiAocXVhbnRpbGUoaGxfaSwgcHJvYj1jKDAuMDI1LDAuOTc1KSksIDMpLGNvbGxhcHNlPSItIikgIyA5NWNpIG1lZCBpbmRpdmlkdWFsIGhhbGZsaWZlCmdtX2hsX2kgPC0gcGFzdGUoc2lnbmlmIChleHAobWVhbihsb2coaGxfaSkpKSwgMykpICMgZ20gKHdoaWNoIHNob3VsZCBiZSByZWFsbHkgY2xvc2UpCmdzZF9obF9pIDwtIHBhc3RlKHNpZ25pZiAoZXhwKHNkKGxvZyhobF9pKSkpLCAzKSkgIyBnc2QgaW5kaXZpZHVhbAoKbWVkX1ZkX2kgPC0gcGFzdGUoc2lnbmlmIChtZWRpYW4oZXhwKGRhdCRsbl9WZF9pKSksIDMpKSAjIG1lZGlhbiBpbmRpdmlkdWFsIFZkCmNpX21lZF9WZF9pIDwtcGFzdGUoc2lnbmlmIChxdWFudGlsZShleHAoZGF0JGxuX1ZkX2kpLCBwcm9iPWMoMC4wMjUsMC45NzUpKSwgMyksY29sbGFwc2U9Ii0iKSAjIDk1Y2kgbWVkIGluZGl2aWR1YWwgVmQKZ21fdmRfaSA8LSBwYXN0ZShzaWduaWYgKGV4cChtZWFuKGRhdCRsbl9WZF9pKSksIDMpKSAjIGdtICh3aGljaCBzaG91bGQgYmUgcmVhbGx5IGNsb3NlKQpnc2RfdmRfaTwtIHBhc3RlKHNpZ25pZiAoZXhwKHNkKGRhdCRsbl9WZF9pKSksIDMpKSAjIGdzZCBpbmRpdgoKCm1lZF9DTF9pIDwtIHBhc3RlKHNpZ25pZiAobWVkaWFuKGV4cChkYXQkbG5fVmRfaStkYXQkbG5fa19pKSksIDMpKSAjIG1lZGlhbiBpbmRpdmlkdWFsIENMCmNpX21lZF9DTF9pIDwtcGFzdGUoc2lnbmlmIChxdWFudGlsZShleHAoZGF0JGxuX1ZkX2krZGF0JGxuX2tfaSksIHByb2I9YygwLjAyNSwwLjk3NSkpLCAzKSxjb2xsYXBzZT0iLSIpICMgOTVjaSBtZWQgaW5kaXZpZHVhbCBDTApjaTk4X21lZF9DTF9pIDwtcGFzdGUoc2lnbmlmIChxdWFudGlsZShleHAoZGF0JGxuX1ZkX2krZGF0JGxuX2tfaSksIHByb2I9YygwLjAxLDAuOTkpKSwgMyksY29sbGFwc2U9Ii0iKSAjIDk4Y2kgbWVkIGluZGl2aWR1YWwgQ0wKZ21fQ0xfaSA8LSBwYXN0ZShzaWduaWYgKGV4cChtZWFuKGRhdCRsbl9WZF9pK2RhdCRsbl9rX2kpKSwgMykpICMgZ20gKHdoaWNoIHNob3VsZCBiZSByZWFsbHkgY2xvc2UpCmdzZF9DTF9pPC0gcGFzdGUoc2lnbmlmIChleHAoc2QoZGF0JGxuX1ZkX2krZGF0JGxuX2tfaSkpLCAzKSkgIyBnc2QgaW5kaXYKYGBgCgoKYGBge3IgaGFsZi1saWZlLGZpZy5oZWlnaHQ9Mi41LGZpZy53aWR0aD00LGRwaT02MDB9ClBGT1NfcHJpb3JzIDwtIGRhdGEuZnJhbWUoCiAgaGFsZmxpZmVfR009IGxvZygyKS9ybG5vcm0oNTAwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbmxvZz0tMS44OTcxLHNkbG9nPTAuNDA1NSkpCk1fayA8LSBleHAoYXMubnVtZXJpYyhkYXQkYE1fbG5faygxKWApKQpQRk9TX2hhbGZsaWZlX0dNIDwtIGxvZygyKS9NX2sKClBGT1NfaGxnbV9wcl9tZWQgPC0gc2lnbmlmKG1lZGlhbihQRk9TX3ByaW9ycyRoYWxmbGlmZV9HTSwzKSkKUEZPU19obGdtX3ByX21lZF85NWNpIDwtcGFzdGUoc2lnbmlmKHF1YW50aWxlKFBGT1NfcHJpb3JzJGhhbGZsaWZlX0dNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2I9YygwLjAyNSwwLjk3NSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2U9Ii0iKQoKUEZPU19obF9tZWRpYW5fZ20gPC0gc2lnbmlmKG1lZGlhbihQRk9TX2hhbGZsaWZlX0dNKSwzKQpQRk9TX2hsX21lZGlhbl9nbV85NWNpIDwtIHBhc3RlKHNpZ25pZihxdWFudGlsZShQRk9TX2hhbGZsaWZlX0dNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2I9YygwLjAyNSwwLjk3NSkpLDMpLGNvbGxhcHNlPSItIikKCnA8LWdncGxvdCgpKwogIHN0YXRfZGVuc2l0eShhZXMoaGFsZmxpZmVfR00sIGNvbG9yID0gIlByaW9yIiksZGF0YT1QRk9TX3ByaW9ycyxnZW9tPSJsaW5lIixzaXplPTIpKwogIHN0YXRfZGVuc2l0eShhZXMoUEZPU19oYWxmbGlmZV9HTSxzdGF0KGRlbnNpdHkpLGNvbG9yPSJQb3N0ZXJpb3IiKSxnZW9tPSJsaW5lIixzaXplPTEuNSApKwogIHhsaW0oMCwxNSkrCiAgbGFicyh0aXRsZSA9IGJxdW90ZSgiQzogUEZPUyJ+VFsxLzJdfiJQb3B1bGF0aW9uIEdNIikgICwKICAgICAgIHN1YnRpdGxlPXBhc3RlKCJQb3N0ZXJpb3IgTWVkaWFuICg5NSUgQ0kpOiAiLAogICAgICAgICAgICAgICAgICAgICAgUEZPU19obF9tZWRpYW5fZ20sIiAoIiwKICAgICAgICAgICAgICAgICAgICAgIFBGT1NfaGxfbWVkaWFuX2dtXzk1Y2ksCiAgICAgICAgICAgICAgICAgICAgICAiKSIsc2VwPSIiKSkrCiAgeGxhYihicXVvdGUoIlBvcHVsYXRpb24gR00iflRbMS8yXX4iKHlycykiKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lPU5VTEwsIwogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1jKFByaW9yPSIjMDA5OTg4IiwgUG9zdGVyaW9yPSIjRUU3NzMzIiApKSArIAogIHRoZW1lX2NsYXNzaWMoKSArICAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uPWMoMC44LDAuNyksCiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3I9ImJsYWNrIixzaXplPTEpLAogICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG9yPU5BKSkKcHJpbnQocCkKZ2dzYXZlKGhlcmUgKCJvdXRwdXQtcGxvdHMiLHBhc3RlMCggc2EsIlBGT1NfaGxfZ20ucGRmIikpLCBwLCBkcGk9NjAwKQpnZ3NhdmUoaGVyZSAoIm91dHB1dC1wbG90cyIscGFzdGUwKCBzYSwiUEZPU19obF9nbS5wbmciKSksIHAsIGRwaT02MDApCmBgYAoKCgpgYGB7ciBQRk9TLWhhbGYtbGlmZS1nc2QsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsZmlnLmhlaWdodD0yLjUsZmlnLndpZHRoPTQsZHBpPTYwMH0KUEZPU19wcmlvcnMkaGFsZmxpZmVfR1NEID0gIGV4cChzcXJ0KGV4cChybm9ybSg1MDAwMCxtPWxvZygwLjE5ODcpLHNkPWxvZygxLjI2NykpKSkpIApQRk9TX2hhbGZsaWZlX0dTRCA8LSBleHAoc3FydChkYXQkYFZfbG5faygxKWApKQoKUEZPU19obGdzZF9wcl9tZWQgPC0gc2lnbmlmKG1lZGlhbihQRk9TX3ByaW9ycyRoYWxmbGlmZV9HU0QsMykpClBGT1NfaGxnc2RfcHJfbWVkXzk1Y2kgPC1wYXN0ZShzaWduaWYocXVhbnRpbGUoUEZPU19wcmlvcnMkaGFsZmxpZmVfR1NELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2I9YygwLjAyNSwwLjk3NSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2U9Ii0iKQpQRk9TX2hsX2dzZF9tZWQgPC0gc2lnbmlmKG1lZGlhbihQRk9TX2hhbGZsaWZlX0dTRCksMykKUEZPU19obF9nc2RfbWVkXzk1Y2kgPC0gcGFzdGUoc2lnbmlmKHF1YW50aWxlKFBGT1NfaGFsZmxpZmVfR1NELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2I9YygwLjAyNSwwLjk3NSkpLDMpLGNvbGxhcHNlPSItIikKcDwtZ2dwbG90KCkrCiAgc3RhdF9kZW5zaXR5KGFlcyhoYWxmbGlmZV9HU0QsIGNvbG9yID0gIlByaW9yIiksZGF0YT1QRk9TX3ByaW9ycyxnZW9tPSJsaW5lIixzaXplPTIpKwogIHN0YXRfZGVuc2l0eShhZXMoUEZPU19oYWxmbGlmZV9HU0Qsc3RhdChkZW5zaXR5KSwgY29sb3IgPSAiUG9zdGVyaW9yIiksZ2VvbT0ibGluZSIsc2l6ZT0xLjUpKwogIHhsaW0oMSwzKSsKICBsYWJzKHRpdGxlID0gYnF1b3RlKCJEOiBQRk9TIn5UWzEvMl1+IlBvcHVsYXRpb24gR1NEIiksIAogICAgICAgc3VidGl0bGU9cGFzdGUoIlBvc3RlcmlvciBNZWRpYW4gKDk1JSBDSSk6ICIsCiAgICAgICAgICAgICAgICAgICAgICBQRk9TX2hsX2dzZF9tZWQsIiAoIiwKICAgICAgICAgICAgICAgICAgICAgIFBGT1NfaGxfZ3NkX21lZF85NWNpLAogICAgICAgICAgICAgICAgICAgICAgIikiLHNlcD0iIikpKwogIHhsYWIoYnF1b3RlKCJQb3B1bGF0aW9uIEdTRCJ+VFsxLzJdKSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWU9TlVMTCwjCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1jKFByaW9yPSIjMDA5OTg4IiwgUG9zdGVyaW9yPSIjRUU3NzMzIiApKSsgCiAgIHRoZW1lX2NsYXNzaWMoKSArICAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uPWMoMC44LDAuNyksCiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3I9ImJsYWNrIixzaXplPTEpLAogICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG9yPU5BKSkKcHJpbnQocCkKZ2dzYXZlKGhlcmUgKCJvdXRwdXQtcGxvdHMiLHBhc3RlMCggc2EsICJQRk9TX2hsX2dzZC5wZGYiKSksIHAsIGRwaT02MDApCmdnc2F2ZShoZXJlICgib3V0cHV0LXBsb3RzIixwYXN0ZTAoIHNhLCAiUEZPU19obF9nc2QucG5nIikpLCBwLCBkcGk9NjAwKQpgYGAKCgojIyMgRGlzdHJpYnV0aW9uIFZvbHVtZQpGb3IgUEZPUywgdGhlIGRhdGEgd2VyZSBub3QgcGFydGljdWxhcmx5IGluZm9ybWF0aXZlLCBidXQgc2xpZ2h0bHkgaW5jcmVhc2VkIHRoZSBlc3RpbWF0ZSBvZiB0aGUgbWVkaWFuIHRvIDAuMzA4KDAuMjIzLTAuNTQ4KSBzbGlnaHRseS4gVGhleSB3ZXJlIG5vdCBpbmZvcm1hdGl2ZSBhcyB0byB0aGUgcG9wdWxhdGlvbiBHU0QsIHdpdGggdGhlIHBvc3RlcmlvciBkaXN0cmlidXRpb25zIGVzc2VudGlhbGx5IHVuY2hhbmdlZCBmcm9tIHRoZSBwcmlvcnMuCmBgYHtyIFBGT1MtdmQtZ20sIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsZmlnLmhlaWdodD0yLjUsZmlnLndpZHRoPTQsZHBpPTYwMH0KUEZPU19wcmlvcnMkVmRfR00gPC0gcmxub3JtKDUwMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW5sb2c9LTEuNDY5NjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Rsb2c9MC4yNjI0KQpQRk9TX1ZkX0dNIDwtIGV4cChkYXQkYE1fbG5fVmQoMSlgKQoKIAoKUEZPU192ZF9nbV9wcl9tZWQgPC0gc2lnbmlmKG1lZGlhbihQRk9TX3ByaW9ycyRWZF9HTSwzKSkKUEZPU192ZF9nbV9wcl9tZWRfOTVjaSA8LSBwYXN0ZShzaWduaWYocXVhbnRpbGUoUEZPU19wcmlvcnMkVmRfR00sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYj1jKDAuMDI1LDAuOTc1KSksIDMpLCBjb2xsYXBzZT0iLSIpClBGT1NfdmRfZ21fbWVkIDwtIHNpZ25pZihtZWRpYW4oUEZPU19WZF9HTSksMykKUEZPU192ZF9nbV9tZWRfOTVjaSA8LSBwYXN0ZShzaWduaWYocXVhbnRpbGUoUEZPU19WZF9HTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iPWMoMC4wMjUsMC45NzUpKSwzKSxjb2xsYXBzZT0iLSIpCgpwPC1nZ3Bsb3QoKSsKICBzdGF0X2RlbnNpdHkoYWVzKFZkX0dNLCBjb2xvciA9ICJQcmlvciIpLGRhdGE9UEZPU19wcmlvcnMsZ2VvbT0ibGluZSIsc2l6ZT0yKSsKICBzdGF0X2RlbnNpdHkoYWVzKFBGT1NfVmRfR00sc3RhdChkZW5zaXR5KSwgY29sb3IgPSAiUG9zdGVyaW9yIiksZ2VvbT0ibGluZSIsc2l6ZT0xLjUpKwogIHhsaW0oMCwxKStsYWJzKHRpdGxlID0gYnF1b3RlKCJDOiBQRk9TIn5WW2RdfiJQb3B1bGF0aW9uIEdNIiksCiAgICAgICAgICAgICAgICAgc3VidGl0bGU9cGFzdGUoIlBvc3RlcmlvciBNZWRpYW4gKDk1JSBDSSk6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZPU192ZF9nbV9tZWQsIiAoIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZPU192ZF9nbV9tZWRfOTVjaSwiKSIsc2VwPSIiKSkrCiAgIHhsYWIoYnF1b3RlKCJQb3B1bGF0aW9uIEdNIn5WW2RdfiIobC9rZykiKSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWU9TlVMTCwjCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPWMoUHJpb3I9IiMwMDk5ODgiLCBQb3N0ZXJpb3I9IiNFRTc3MzMiICkpICsgIHRoZW1lX2NsYXNzaWMoKSArICAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uPWMoMC44LDAuNyksCiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3I9ImJsYWNrIixzaXplPTEpLAogICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG9yPU5BKSkKcHJpbnQocCkKZ2dzYXZlKGhlcmUgKCJvdXRwdXQtcGxvdHMiLHBhc3RlMCggc2EsICJQRk9TX3ZkX2dtLnBkZiIpKSwgcCwgZHBpPTYwMCkKZ2dzYXZlKGhlcmUgKCJvdXRwdXQtcGxvdHMiLHBhc3RlMCggc2EsICJQRk9TX3ZkX2dtLnBuZyIpKSwgcCwgZHBpPTYwMCkKYGBgCgoKYGBge3IgUEZPUy12ZC1zZCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSxmaWcuaGVpZ2h0PTIuNSxmaWcud2lkdGg9NCxkcGk9NjAwfQpQRk9TX3ByaW9ycyRWZF9HU0QgPSBleHAoYWJzKHJub3JtKDUwMDAwLHNkPTAuMTcpKSkKUEZPU19WZF9HU0QgPC0gZXhwKGRhdCRgU0RfbG5fVmQoMSlgKQoKUEZPU192ZF9nc2RfcHJfbWVkIDwtIHNpZ25pZihtZWRpYW4oUEZPU19wcmlvcnMkVmRfR1NELDMpKQpQRk9TX3ZkX2dzZF9wcl9tZWRfOTVjaSA8LSBwYXN0ZShzaWduaWYocXVhbnRpbGUoUEZPU19wcmlvcnMkVmRfR1NELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2I9YygwLjAyNSwwLjk3NSkpLCAzKSwgY29sbGFwc2U9Ii0iKQoKUEZPU192ZF9nc2RfbWVkIDwtIHNpZ25pZihtZWRpYW4oUEZPU19WZF9HU0QpLDMpClBGT1NfdmRfZ3NkX21lZF85NWNpIDwtIHBhc3RlKHNpZ25pZihxdWFudGlsZShQRk9TX1ZkX0dTRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iPWMoMC4wMjUsMC45NzUpKSwzKSxjb2xsYXBzZT0iLSIpCgpwPC1nZ3Bsb3QoKSsKICBzdGF0X2RlbnNpdHkoYWVzKFZkX0dTRCwgY29sb3IgPSAiUHJpb3IiKSxkYXRhPVBGT1NfcHJpb3JzLGdlb209ImxpbmUiLHNpemU9MikrCiAgc3RhdF9kZW5zaXR5KGFlcyhQRk9TX1ZkX0dTRCxzdGF0KGRlbnNpdHkpLCBjb2xvciA9ICJQb3N0ZXJpb3IiKSxnZW9tPSJsaW5lIixzaXplPTEuNSkrCiAgeGxpbSgxLDMpKwogIGxhYnModGl0bGUgPSBicXVvdGUoIkQ6IFBGT1MiflZbZF1+IlBvcHVsYXRpb24gR1NEICIpLAogICAgICAgc3VidGl0bGU9cGFzdGUoIlBvc3RlcmlvciBNZWRpYW4gKDk1JSBDSSk6ICIsCiAgICAgICAgICAgICAgICAgICAgICBQRk9TX3ZkX2dzZF9tZWQsIiAoIiwKICAgICAgICAgICAgICAgICAgICAgIFBGT1NfdmRfZ3NkX21lZF85NWNpLAogICAgICAgICAgICAgICAgICAgICAgIikiLHNlcD0iIikpKwogeGxhYihicXVvdGUoIlBvcHVsYXRpb24gR1NEIn5WW2RdKSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWU9TlVMTCwgCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1jKFByaW9yPSIjMDA5OTg4IiwgUG9zdGVyaW9yPSIjRUU3NzMzIiApKSArIAogIHRoZW1lX2NsYXNzaWMoKSArICAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uPWMoMC44LDAuNyksCiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3I9ImJsYWNrIixzaXplPTEpLAogICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG9yPU5BKSkKcHJpbnQocCkKZ2dzYXZlKGhlcmUgKCJvdXRwdXQtcGxvdHMiLHBhc3RlMCggc2EsICJQRk9TX3ZkX2dzZC5wZGYiKSksIHAsIGRwaT02MDApCmdnc2F2ZShoZXJlICgib3V0cHV0LXBsb3RzIixwYXN0ZTAoIHNhLCAiUEZPU192ZF9nc2QucG5nIikpLCBwLCBkcGk9NjAwKQpgYGAKCiMjIyBDbGVhcmFuY2UKCkNsIGlzIGsgKiBWZAoKYGBge3IgUEZPUy1jbC1nbSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSxmaWcuaGVpZ2h0PTIuNSxmaWcud2lkdGg9NCxkcGk9NjAwfQpQRk9TX3ByaW9ycyRDTF9HTSA8LSBQRk9TX3ByaW9ycyRWZF9HTSAqIChsb2coMikvUEZPU19wcmlvcnMkaGFsZmxpZmVfR00pClBGT1NfQ0xfR00gPC0gZXhwKGRhdCRgTV9sbl9WZCgxKWAgKyBkYXQkYE1fbG5faygxKWApCgpQRk9TX2NsX2dtX3ByX21lZCA8LSBzaWduaWYobWVkaWFuKFBGT1NfcHJpb3JzJENMX0dNLDMpKQpQRk9TX2NsX2dtX3ByX21lZF85NWNpIDwtIHBhc3RlKHNpZ25pZihxdWFudGlsZShQRk9TX3ByaW9ycyRDTF9HTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iPWMoMC4wMjUsMC45NzUpKSwgMyksIGNvbGxhcHNlPSItIikKUEZPU19jbF9nbV9tZWQgPC0gc2lnbmlmKG1lZGlhbihQRk9TX0NMX0dNKSwzKQpQRk9TX2NsX2dtX21lZF85NWNpIDwtIHBhc3RlKHNpZ25pZihxdWFudGlsZShQRk9TX0NMX0dNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2I9YygwLjAyNSwwLjk3NSkpLDMpLGNvbGxhcHNlPSItIikKCnA8LWdncGxvdCgpKwogIHN0YXRfZGVuc2l0eShhZXMoQ0xfR00sIGNvbG9yID0gIlByaW9yIiksZGF0YT1QRk9TX3ByaW9ycyxnZW9tPSJsaW5lIixzaXplPTIpKwogIHN0YXRfZGVuc2l0eShhZXMoUEZPU19DTF9HTSxzdGF0KGRlbnNpdHkpLCBjb2xvciA9ICJQb3N0ZXJpb3IiKSxnZW9tPSJsaW5lIixzaXplPTEuNSkrCiAgeGxpbSgwLDAuMjUpK2xhYnModGl0bGUgPSAiQjogUEZPUyBDbGVhcmFuY2UgUG9wLiBHTSAiLHN1YnRpdGxlPXBhc3RlKCJQb3N0ZXJpb3IgTWVkaWFuICg5NSUgQ0kpOiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGT1NfY2xfZ21fbWVkLCIgKCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZPU19jbF9nbV9tZWRfOTVjaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSIsc2VwPSIiKSkrCiAgeGxhYigiUG9wLiBHTSBDTCAobC8oa2cteXIpKSIpKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lPU5VTEwsIwogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1jKFByaW9yPSIjMDA5OTg4IiwgUG9zdGVyaW9yPSIjRUU3NzMzIiApKSArICAKICB0aGVtZV9jbGFzc2ljKCkgKyAgCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbj1jKDAuOCwwLjcpLAogICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yPSJibGFjayIsc2l6ZT0xKSwKICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvcj1OQSkpCnByaW50KHApCmdnc2F2ZShoZXJlICgib3V0cHV0LXBsb3RzIixwYXN0ZTAoIHNhLCAiUEZPU19DTF9nbS5wZGYiKSksIHAsIGRwaT02MDApCmdnc2F2ZShoZXJlICgib3V0cHV0LXBsb3RzIixwYXN0ZTAoIHNhLCAiUEZPU19DTF9nbS5wbmciKSksIHAsIGRwaT02MDApCmBgYAoKYGBge3IgUEZPUy1DTC1zZCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSxmaWcuaGVpZ2h0PTIuNSxmaWcud2lkdGg9NCxkcGk9NjAwfQpQRk9TX3ByaW9ycyRDTF9HU0QgPSBleHAoc3FydChsb2coUEZPU19wcmlvcnMkVmRfR1NEKV4yICsgCiAgbG9nKFBGT1NfcHJpb3JzJGhhbGZsaWZlX0dTRCleMikpClBGT1NfQ0xfR1NEIDwtIGV4cChzcXJ0KGxvZyhQRk9TX1ZkX0dTRCleMiArIAogIGxvZyhQRk9TX2hhbGZsaWZlX0dTRCleMikpCgpQRk9TX0NMX2dzZF9wcl9tZWQgPC0gc2lnbmlmKG1lZGlhbihQRk9TX3ByaW9ycyRDTF9HU0QsMykpClBGT1NfQ0xfZ3NkX3ByX21lZF85NWNpIDwtIHBhc3RlKHNpZ25pZihxdWFudGlsZShQRk9TX3ByaW9ycyRDTF9HU0QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYj1jKDAuMDI1LDAuOTc1KSksIDMpLCBjb2xsYXBzZT0iLSIpCgpQRk9TX0NMX2dzZF9tZWQgPC0gc2lnbmlmKG1lZGlhbihQRk9TX0NMX0dTRCksMykKUEZPU19DTF9nc2RfbWVkXzk1Y2kgPC0gcGFzdGUoc2lnbmlmKHF1YW50aWxlKFBGT1NfQ0xfR1NELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2I9YygwLjAyNSwwLjk3NSkpLDMpLGNvbGxhcHNlPSItIikKCnA8LWdncGxvdCgpKwogIHN0YXRfZGVuc2l0eShhZXMoQ0xfR1NELCBjb2xvciA9ICJQcmlvciIpLGRhdGE9UEZPU19wcmlvcnMsZ2VvbT0ibGluZSIsc2l6ZT0yKSsKICBzdGF0X2RlbnNpdHkoYWVzKFBGT1NfQ0xfR1NELHN0YXQoZGVuc2l0eSksIGNvbG9yID0gIlBvc3RlcmlvciIpLGdlb209ImxpbmUiLHNpemU9MS41KSsKICB4bGltKDEsMykrCiAgbGFicyh0aXRsZSA9IGJxdW90ZSgiSDogUEZPUyJ+Q0x+IlBvcHVsYXRpb24gR1NEICIpLAogICAgICAgc3VidGl0bGU9cGFzdGUoIlBvc3RlcmlvciBNZWRpYW4gKDk1JSBDSSk6ICIsCiAgICAgICAgICAgICAgICAgICAgICBQRk9TX0NMX2dzZF9tZWQsIiAoIiwKICAgICAgICAgICAgICAgICAgICAgIFBGT1NfQ0xfZ3NkX21lZF85NWNpLAogICAgICAgICAgICAgICAgICAgICAgIikiLHNlcD0iIikpKwogIHhsYWIoYnF1b3RlKCJQb3B1bGF0aW9uIEdTRCJ+Q0wpKSsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZT1OVUxMLCAKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPWMoUHJpb3I9IiMwMDk5ODgiLCBQb3N0ZXJpb3I9IiNFRTc3MzMiICkpICsgCiAgdGhlbWVfY2xhc3NpYygpICsgIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb249YygwLjgsMC43KSwKICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvcj0iYmxhY2siLHNpemU9MSksCiAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9InRyYW5zcGFyZW50IiwgY29sb3I9TkEpKQpwcmludChwKQpnZ3NhdmUoaGVyZSAoIm91dHB1dC1wbG90cyIscGFzdGUwKCBzYSwiUEZPU19DTF9nc2QucGRmIikpICxwLGRwaT02MDApCmdnc2F2ZShoZXJlICgib3V0cHV0LXBsb3RzIixwYXN0ZTAoIHNhLCJQRk9TX0NMX2dzZC5wbmciKSkgLHAsZHBpPTYwMCkKYGBgCiMjIFRhYmxlIHNpZ25pZmljYW50IGRpZ2l0IHZhbHVlcwoKYGBge3IgdGFibGUtdmFycyB9ClBGT1NfaGxnbV9wcl9tZWQgPC0gcGFzdGUoc2lnbmlmKFBGT1NfaGxnbV9wcl9tZWQsIDMpKQpQRk9TX2hsX21lZGlhbl9nbTwtIHBhc3RlKHNpZ25pZihQRk9TX2hsX21lZGlhbl9nbSwgMykpClBGT1NfaGxnc2RfcHJfbWVkPC0gcGFzdGUoc2lnbmlmKFBGT1NfaGxnc2RfcHJfbWVkLCAzKSkKUEZPU19obF9nc2RfbWVkPC0gcGFzdGUoc2lnbmlmKFBGT1NfaGxfZ3NkX21lZCwgMykpClBGT1NfdmRfZ21fcHJfbWVkPC0gcGFzdGUoc2lnbmlmKFBGT1NfdmRfZ21fcHJfbWVkLCAzKSkKUEZPU192ZF9nbV9tZWQ8LSBwYXN0ZShzaWduaWYoUEZPU192ZF9nbV9tZWQsIDMpKQpQRk9TX3ZkX2dzZF9wcl9tZWQ8LSBwYXN0ZShzaWduaWYoUEZPU192ZF9nc2RfcHJfbWVkLCAzKSkKUEZPU192ZF9nc2RfbWVkPC0gcGFzdGUoc2lnbmlmKFBGT1NfdmRfZ3NkX21lZCwgMykpClBGT1NfY2xfZ21fcHJfbWVkPC0gcGFzdGUoc2lnbmlmKFBGT1NfY2xfZ21fcHJfbWVkLCAzKSkKUEZPU19jbF9nbV9tZWQ8LSBwYXN0ZShzaWduaWYoUEZPU19jbF9nbV9tZWQsIDMpKQpgYGAKCiMjIyBQb3B1bGF0aW9uIG1lZGlhbiBlc3RpbWF0ZXMgWzk1JSBDSV0gCgp8IFBhcmFtZXRlciAgICAgICAgICAgICAgICAgICAgICB8IFByaW9yIEdNICAgICAgfCBQb3N0ZXJpb3IgR00gfCBQcmlvciAgR1NEICAgIHwgUG9zdGVyaW9yIEdTRCB8IAp8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS06fDotLS0tLS0tLS0tLS06fDotLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLTp8IAp8IEhhbGYtbGlmZSAoeWVhcnMpICB8IGByIHBhc3RlKFBGT1NfaGxnbV9wcl9tZWQpIGAgfCAgIGByIHBhc3RlKFBGT1NfaGxfbWVkaWFuX2dtKSBgICAgIHwgYHIgIHBhc3RlKFBGT1NfaGxnc2RfcHJfbWVkKSBgICAgICAgICAgICB8IGByIHBhc3RlKFBGT1NfaGxfZ3NkX21lZClgICB8IAp8IEhMICBbOTUlIENJXSAgfGByIHBhc3RlMCgiWyIsUEZPU19obGdtX3ByX21lZF85NWNpLCJdIilgIHwgYHIgcGFzdGUwKCAiWyIsUEZPU19obF9tZWRpYW5fZ21fOTVjaSwiXSIpYHwgYHIgcGFzdGUwKCJbIixQRk9TX2hsZ3NkX3ByX21lZF85NWNpLCJdIilgfCBgciBwYXN0ZTAoICJbIixQRk9TX2hsX2dzZF9tZWRfOTVjaSwgIl0iKWB8CnwgVm9sdW1lIG9mIGRpc3RyaWJ1dGlvbiAgICB8IGByIHBhc3RlKFBGT1NfdmRfZ21fcHJfbWVkKSBgIHwgICAgYHIgcGFzdGUoICBQRk9TX3ZkX2dtX21lZCkgYHwgICBgciAgcGFzdGUoUEZPU192ZF9nc2RfcHJfbWVkKWAgIHxgciAgcGFzdGUoUEZPU192ZF9nc2RfbWVkKWAgfCAgCnwgJFZfRCQgWzk1JSBDSV0gICAgfGByIHBhc3RlMCggIlsiLFBGT1NfdmRfZ21fcHJfbWVkXzk1Y2ksIl0iKWB8IGByIHBhc3RlMCggIlsiLFBGT1NfdmRfZ21fbWVkXzk1Y2ksIl0iKWB8IGByIHBhc3RlMCgiWyIsUEZPU192ZF9nc2RfcHJfbWVkXzk1Y2ksICJdIilgfCBgciBwYXN0ZTAoICAiWyIsUEZPU192ZF9nc2RfbWVkXzk1Y2ksICJdIilgfCAKfCBDbGVhcmFuY2UgICAgfCBgciBwYXN0ZShQRk9TX2NsX2dtX3ByX21lZCkgYCB8ICAgIGByIHBhc3RlKCAgUEZPU19jbF9nbV9tZWQpIGB8ICAgYHIgIHBhc3RlKClgICB8YHIgIHBhc3RlKClgIHwgIAp8ICRDTCQgWzk1JSBDSV0gICAgfGByIHBhc3RlMCggIlsiLFBGT1NfY2xfZ21fcHJfbWVkXzk1Y2ksIl0iKWB8IGByIHBhc3RlMCggIlsiLFBGT1NfY2xfZ21fbWVkXzk1Y2ksIl0iKWB8IGByIHBhc3RlMCgiWyIsICJdIilgfCBgciBwYXN0ZTAoICAiWyIsICJdIilgfCAKIAoKCgojIyMgSW5kaXZpZHVhbCBQb3N0ZXJpb3IgZXN0aW1hdGVzIAoKfCBQYXJhbWV0ZXIgICAgICAgICAgICAgICAgICAgICAgfCAgbWVkaWFuIEdNICBbOTUlIENJXSB8IEdNIGNhbGN1bGF0b3IgaW5wdXQgIHwgIEdTRCBpbmRpdmlkdWFsIHwKfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tOnwgCnwgSGFsZi1saWZlICh5ZWFycykgICAgICAgICAgICAgIHwgYHIgIHBhc3RlKG1lZF9obF9pLCAiWyIsY2lfbWVkX2hsX2ksIl0iKSBgIHwgYHIgIHBhc3RlKGdtX2hsX2kpIGAgfCBgciAgcGFzdGUoZ3NkX2hsX2kpYHwKfCBWb2x1bWUgb2YgZGlzdHJpYnV0aW9uICRWX0QkICAgfCBgciAgcGFzdGUobWVkX1ZkX2ksICJbIixjaV9tZWRfVmRfaSwiXSIpIGB8ICBgciAgcGFzdGUoZ21fdmRfaSkgYCB8IGByICBwYXN0ZShnc2RfdmRfaSkgYHwgCnwgQ2xlYXJhbmNlIChML2tnLXlyKSAgIHwgYHIgIHBhc3RlKG1lZF9DTF9pLCAiWyIsY2lfbWVkX0NMX2ksIl0iLCAiW1siLGNpOThfbWVkX0NMX2ksIl1dIikgYCB8IGByICBwYXN0ZShnbV9DTF9pKSBgIHwgYHIgIHBhc3RlKGdzZF9DTF9pKSBgfCAKCmBgYHtyIGVjaG89RkFMU0V9CmRldnRvb2xzOjpzZXNzaW9uX2luZm8oKQpgYGA=